一、基本原理
CAS 被认为是一种乐观锁,乐观锁,会以一种更加乐观的态度对待事情,认为自己可以操作成功。当多个线程操作同一个共享资源时,仅能有一个线程同一时间获得锁成功,在乐观锁中,其他线程发现自己无法成功获得锁,并不会像悲观锁那样阻塞线程,而是直接返回,可以去选择再次重试获得锁,也可以直接退出。
CAS,( Compare And Swap),对比之后交换数据,有几个重要的参数:
(1)this,Unsafe 对象本身,需要通过这个类来获取 value 的内存偏移地址。
(2)valueOffset,value 变量的内存偏移地址。
(3)expect,期望更新的值。
(4)update,要更新的最新值。
比较
expect
的值和内存地址this + valueOffset
中存储的值,如果一致,把地址中的值替换
为update
值,否则失败,然后重新获取内存地址的当前值,并重新计算想要修改的新值,这个重新尝试的过程叫做自旋。
二、基本应用
2.1 Atomic类
比如常见的那个开启两个线程,每个线程每休眠10ms,再让count
自增1,循环100次后,count
不能保证输出结果为200
的场景,有两种解决方案:
- 应用
synchronized
...
for(