synchronized 就是悲观锁 ;
二、乐观锁
----
乐观锁 : 持有乐观的态度 , 线程 A 访问共享资源 , 乐观的认为只有
1
个线程访问该资源 , 不用进行加锁 ;
线程 A 访问主内存变量前..., 记录下值
X
, 线程 A 访问完毕后 , 会将最终的值同步到主内存中 , 此时会检查下 主内存中变量的值是否还是
X
,
如果是 , 则说明 线程 A 访问期间 没有线程修改该变量值 ,...那么将线程 A 计算的 新值更新到主内存中
如果不是 , 主内存中的变量值变成了
Y
, 那么说明该值 被其它线程修改了 ; 那么将当前值抛弃 , 重新从主内存获取变量值
Y
, 然后线程 A...继续执行 , 执行完毕后将计算结果同步到主内存变量中 , 再次对比主内存中的变量值是否是
Y
, 如果是可以更新 , 如果不是 , 那么再次重复本操作 ;
乐观锁 , 全程没有加锁 , 没有阻塞 ,...;
解决方案 : 给变量设置一个版本号 , 每次线程访问变量时 , 版本号 +1 , 这样每次判断变量的版本号即可 ;
循环时间过长 :
问题描述 : 乐观锁中 , 假如连续多次写回数据时 , 发现值改变