多线程环境下,两个线程A,B可能会对共享数据m进行操作。为了保证一个线程在读到数据跟写入数据之间没有被其他线程修改过,使用cas解决。
cas:更改之前先判断旧值是否有变化,如果没有变化,认为没有线程对该共享值做过操作。(
这种认为是有一下问题的,
时 | 线程A | 线程B |
T1 | 读m值为1 | |
T2 | 读m值为1 | |
T3 | 查询m值是否为1,并更新m值为2 | |
T4 | 读m值为2 | |
T5 | 查询m值是否为2,并更新m值为1 | |
T6 | 查询m值是否为1,并更新m值为2 | |
B线程已经对数据做了两次修改,而A却并不清楚这个修改,以为是没有任何线程对其做修改。
这个问题称之为aba。
aba问题解决:使用修改字段加时间戳,在cas判断m值的时候,同时对时间戳进行判断。如果时间戳不一样,说明其他线程对该字段进行了修改。