乐观锁和悲观锁
- 悲观锁:等待持有锁的线程释放锁。
- 乐观锁:先假定没有锁而进行操纵,监测到冲突后重试。
synchronized
是独占锁,而独占锁是一种悲观锁。- CAS机制是一种乐观锁(compare and swap)
CAS(compare and swap)算法
含义:
如果指定位置的值符合预期,则将其替换为新值。
包含三个操作数:内存地址、预期值和新值。
保证了读-修改-写
这种操作的原子性,因为预期值不符合会执行重试。
实现了无锁的,非阻塞
的原子操作。
问题:
1. ABA问题,可以用加版本号的方式解决,在concurrent包中参见AtomicStampedReference
类的compareAndSet()
方法。
2. 循环时间长,增大开销。
3. 一次只能保证一个变量的原子性操作。