定义
博客链接1
多线程并发环境下,有两种更新共享变量的方式: 1)悲观锁 2)乐观锁
- 悲观锁
线程访问同步代码块之前加锁,访问完成再释放。其他线程如果也访问,从runable状态变为blocked状态,等待线程结束再进入就绪状态等待操作系统调度。 - 乐观锁
线程访问共享变量时,从主内存中拷贝数据到工作内存,更新操作修改将计算后的值再更新到主内存中。CAS(compare and set):在更新操作前,比较工作内存中未处理之前的值 与 主内存目前的值 是否相同,如果相同直接更新,如果不相同则重新加载->计算->保存。CAS机制中的这步步骤是原子性的(从指令层面提供的原子操作)
优缺点
优点
- 可以保证变量操作的原子性
- 在线程占用共享变量时间短时,效率高
- 在并发量不大的情况下,比syschronized效率高
缺点
- ABA问题:虽然值相同但被修改过,通过使用Pair类,加入版本号
- 在线程之间竞争程度大的时候,如果使用CAS,每次都有很多的线程在竞争,也就是说CAS机制不能更新成功。这种情况下CAS机制会一直重试,这样就会比较耗费CPU。因此可以看出,如果线程之间竞争程度小,使用CAS是一个很好的选择;但是如果竞争很大,使用锁可能是个更好的选择。
- 不能保证共享代码块的原子性
网友评论