CAS无锁机制&ABA问题
2022-06-30 00:33:48 0 举报
无锁机制使用一种叫做比较交换的技术(CAS Compare And Swap)来鉴别线程冲突,一旦检测到冲突产生,就重试当前操作直到没有冲突为止。
作者其他创作
大纲/内容
T2线程
阻塞
新值Bv1
变量值Av1
s2-共享变量
read
变量值A
新值B
变量值Av2
对于主内存中的变量值A,在线程的工作内存中存在共享变量的拷贝值A,此时线程T2更新变量值为新值B。如果主内存的变量值A和工作内存的变量值A相等就把新值B写入主内存,更新变量值A为新值B,并通知T1线程,T1线程如果使用变量值A,需要先执行cas获取变量值A的最新值进行下一步操作,这个过程是原子性的。
T1线程
内存模型当中定义了一个主内存,所有声明的实例变量都存在于主内存当中,主内存的数据会共享给所有线程,每一个线程有一块工作内存,工作内存当中主内存数据的副本当更新数据时,会将工作内存中的数据同步到主内存当中
缓存一致性协议MESI
s2更新为A
s3-共享变量
解决ABA问题
主内存
共享变量
write
CPU Cache工作内存
s1-共享变量
共享变量副本
ABA问题的危害:小明去取款机取款,由于取款机老旧,多点击了几次取款T1线程 (100 - 50 )= ? 被阻塞T2线程 (100 - 50)= 50 取款成功此时T1线程还在阻塞朋友给小明还钱T2线程 (50 + 50)= 100 汇款成功t1 线程恢复后执行 (100 - 50) = 50小明:我的钱呢????银行:开发人员杀了祭天。。
失效判断
更新为B
UnSafe类 里面有三个值:分别为 v e nv =- 内存值 (共享变量)e = 旧预值 (读取的v的副本值 工作内存值)n = 新值 需要修改我们共享变量值
CPU总线嗅探机制
Java内存模型
根据MESI协议, 写回主内存的操作会导致其它CPU工作内存中,基于主内存的数据副本失效
ABA问题
s1时刻,主内存和t1、t2线程工作内存的变量值相同; s2时刻,t1、t2线程同时执行任务, t2更新工作内存变量值为新值B, t1线程执行任务过程中被阻塞了s3时刻,t1线程还在阻塞,t2又进行了变量更新,此时更新为变量值A,t1线程解除阻塞后判断工作内存值和主内存值一致,继续操作这时候就出现了A ->B -> A的问题
s1更新为B
AtomicStampedReference类便是使用版本号来解决ABA问题的(带时间错的原子引用)
s1时刻,主内存和t1、t2线程工作内存的变量值相同,版本都是v1; s2时刻,t1、t2线程同时执行任务, t2更新工作内存变量值为新值B版本为v1, t1线程执行任务过程中被阻塞了s3时刻,t1线程还在阻塞,t2又进行了变量更新,此时更新为变量值A版本为v2, t1线程解除阻塞后判断工作内存值和主内存值不一致,进行CAS自旋,获取最新共享变量值后继续操作这解决了A ->B -> A的问题
CAS(Compare And Swap)
0 条评论
下一页
为你推荐
查看更多