在大多数博客当中描述的使用新增字段version用于判断来解决aba问题。
对于如下场景:
thread 1:
version: 1
val: 1
cas(version, 2)
被thread 2和thread 3插入
thread 2:
version: 2
val:1
cas(version,3)
cas(val, 10)
thread 3:
version:3
val:10
cas(version, 4)
cas(val, 1)
此时回到thread 1:
cas(val, 2)
提出此问题的点在于,cpu指令中的cas仅仅是一个内存单元(8/16/32)的cas操作,如果增加了version则是两个cas操作,既然存在两个cas操作又是如何保证原子性的??通过设置不可中断吗?
加入版本号是指将val和version合并成一个值进行记录? 比如记成version:val的形式,这样A-B-A就变成 1:A-2:B-3:A的形式。而不是说版本号和val分开进行CAS.
不知道你这个问题是否已经解决, 如果还没有解决的话: