, 那么将线程 A 计算的 新值更新到主内存中
如果不是 , 主内存中的变量值变成了
Y
, 那么说明该值 被其它线程修改了 ; 那么将当前值抛弃 , 重新从主内存获取变量值
Y
, 然后线程...A 继续执行 , 执行完毕后将计算结果同步到主内存变量中 , 再次对比主内存中的变量值是否是
Y
, 如果是可以更新 , 如果不是 , 那么再次重复本操作 ;
乐观锁 , 全程没有加锁 , 没有阻塞...java.util.concurrent 包简称 J.U.C ;
CAS 解决的
3
大问题 :
ABA 问题 :
问题描述 : 线程 A 访问变量 X = 0 , 访问期间 , 线程 B 访问 X 将其改为...1 , 然后 线程 C 访问 X 将其又改为 0 , 此时线程 A 访问完毕后 , 查询发现变量 X 仍然是 0 , 认为期间没有线程访问该变量 ;
解决方案 : 给变量设置一个版本号 , 每次线程访问变量时...封装多个变量到一个类对象中 , 保证共享变量的原子性 ;
线程 A 访问共享变量的操作 , 不是原子操作 , 就会导致如下问题 :
线程 A 访问变量 X , 执行完毕后 , 变量 X 值原始值进行比较 , 比较相等 , 将数据更新到主内存