Java CAS

java.util.concurrent包借助于CAS实现了区别于synchronized同步锁的一种乐观锁.

1. CAS(compare and swap):

In computer science, CAS is an atomic instruction used in multithreading to ahcieve synchronization,. It compares the contents of a memory location to a given value and only if ther are the same, modifies the content of that memory location to a given new value.


2. 关于CPU的锁有如下三种:
  • 处理器自动保证基本内存操作的原子性.
    • 处理器自动保证对同一个缓存行里进行16/32/64位操作是原子的,但复杂的操作(如跨多个缓存行,跨页表访问)不能保证.
  • 使用总线锁操作保证原子性.
    • 总线锁就是使用处理器提供的LOCK#信号,当一个处理器在总线上输出此信号时,其他处理器的请求将被阻塞.
  • 使用缓存锁保证原子性.
    • 频繁使用的内存会被缓存在处理器的L1,L2,L3高速缓存里,那么原子操作就可以直接在CPU的高速缓存中进行.

3. CAS的缺陷:
  • ABA问题(使用AtomicStampedReference来处理):
    • 如果一个值从A变成B,然后变回A. 那么使用CAS检查时会发现它的值没有发生变化,但实际上却变了.
    • 解决的方案是追加版本号,1A -> 2B -> 3A.
  • 循环时间长,开销大
  • 只能保证一个共享变量的原子操作:
    • 解决方案: 把多个共享 变量合成一个共享变量,AtomicReference