我觉得玩锁的最高境界,就是不用锁。
锁其实是为了解决并发访问时,乱序写动作造成的数据不一致问题。
细分下来,很多时候可以不用锁的。
1、针对一个资源所有的操作都是读的时候。
2、只有一个线程访问的时候,即资源只有唯一持有人。
3、同一时刻只有一个线程访问的时候,即串行访问模式。
既然有这么多方法,其实在系统设计时,我们可以通过精心设计,规避很多使用锁的时候。
如:
1、对于很多查表运算,表在程序Init的时候就初始化成功,之后只读,则不需要加锁。
2、对于线程自己的变量,无其他人访问,不需要加锁。
3、利用事务批处理机,事务处理队列,将同步动作改为异步动作,资源的访问永远具有唯一性,则也不需要加锁。
另外,就算一个资源真的读写频繁,需要加锁,也有很多提高效率的方法的。
单写多读锁是个很明显的例子,即读并发,写互斥。
另外,很多时候,锁不一定要做成锁的样子的,如被动资源池的构建,其效率很难平衡,如果参照锁的理论,用二元动作定义访问,则可以很好地解决资源的并发争用问题。兼顾稳定性和效率的平衡。
此时,虽然我们做的是一个池子,但实际上用法和一个锁的用法是一样的。它也叫锁。