-
独占锁synchronized是一项__悲观__技术, 它假设最坏的情况
-
CAS
(1) 全名 Compare and Swap
(2) 是一项__乐观__技术
(3) CAS包含__3个__操作数
1° 需要读写的内存位置V
2° 进行比较的值A
3° 准备写入内存的新值B
(4) 具体操作
当且仅当位置V的值等于A时, CAS才会通过__原子方式__将B写入V的位置, 否则不执行任何操作;
无论V的值是否等于A, 都返回V原有的值
(5) 含义
认为V的值应该是A, 如果是就更新V的值为B; 如果不是就啥也不干并且告诉你本来V的值是多少
(6) 使用示例: 非阻塞的计数器
@ThreadSafe public class CasCounter { private SimulatedCAS value; public int getValue() { return value.get(); } public int increment() { int v; do { v = value.get(); } while (v != value.compareAndSwap(v, v + 1)); return v + 1; } }
在increment函数中, 首先会获取内存V处的值, 然后进行CAS操作: 如果获取到的值和v相等说明没有其他线程干扰, 因此可以更改V处的值; 否则就重复while循环
-
CAS的__优点__: 在竞争程度不高时, 性能远远超过锁的方式
CAS的__缺点__: 调用者需要手动决定发生竞争时的策略(重试or回退or放弃)
-
JVM对CAS的支持
(1) __原子变量类__使用了底层的JVM支持为数字类型和引用类型提供了一种高效的CAS操作
(2) java.util.concurrent中的大多数类直接或间接的使用了这些原子变量类