本篇涉猎:
悲观锁与乐观锁
悲观锁
何为悲观?永远处于一个消极悲观状态,因此悲观锁觉得并发操作每次都可能有问题,于是每次都会加锁。
稍微详细解释:
悲观锁认为对于同一个数据的并发操作,一定会发生修改的,哪怕没有修改,也会认为修改。因此对于同一份数据的并发操作,悲观锁采取加锁的形式。悲观地认为,不加锁并发操作一定会出问题。
如图所示,假设现在有多个线程想操作同一个资源对象,可能有人就会想到使用互斥锁进行同步,而它的同步方式就是悲观的。认为如果不严格同步线程调用,便会出问题。因此,互斥锁会将资源锁定,只供一个线程使用。
乐观锁
何为乐观?永远处于乐观积极状态,因此乐观锁觉得并发操作期间是不会出问题的,操作数据不加锁,只会在最后更新数据时检查数据有没有被修改,没有的话才更新。
通常乐观锁可以用CAS算法或则vision版本机制实现。在Java中,java.util.concurrent.atomic包下的原子类就是使用CAS实现的。