乐观锁与悲观锁
Synchronized这种独占锁,属于悲观锁。
悲观锁始终假定会发生并发冲突,因此会屏蔽一切可能会违反数据完整性的操作。
乐观锁假设不会发生并发冲突,因此只在提交操作时检查是否违反数据完整性,如果提交失败,则会进行重试。乐观锁最常见的就是CAS了。
CAS(Compare and Swap)
是一种高效实现线程安全性的方法
支持原子更新操作,适用于计数器,序列发生器等场景
属于乐观锁机制,号称lock-free
CAS操作失败时有开发者决定是继续尝试,还是执行别的操作。因此执行失败的线程不会被阻塞挂起
CAS思想
包含三个操作数-内存位置(V)、预期原值(A)、新值(B)
执行CAS时,将内存位置的值与预期原值进行比较,如果相等的话,那么处理器会将该位置的值更新为新值,否则处理器不做任何操作
缺点
1.若循环时间长,则开销很长。如果CAS操作失败,会一直进行while的尝试,如果CAS长时间一直不成功,可能会给CPU带来很大的开销。
2.只能保证一个共享变量的原子操作。如果想要保证多个变量的线程安全,只能使用Synchronized
3.ABA问题:如果内存地址V首次读取数据的值是A,其后被其他线程改成了B,而后又改成了A。在CAS准备赋值时检查到它的值仍然为A,CAS就会误认为该变量没有被其他线程改变过。
解决ABA问题:AtomicStampedReference
通过控制变量值的版本,来保证CAS的正确性