CAS是compare and swap,例如:生成唯一不重复自增ID的功能,可以用两种方法来实现:、
1、加锁方式
维护一个全局变量Long ID,每次线程请求生成新ID首先将全局ID锁住,ID++生成完新ID后解锁,再提供给其他线程使用。
可以保证ID的唯一性,但是效率低下,被锁住后都要排队等候解锁。
2、CAS方式
(1)维护一个全局变量Long ID,每次线程请求生成新ID不加锁,只获取当前ID值,
(2)ID++后再次查询全局ID,如果当前全局ID还是之前获取的ID,那么将全局ID改为ID++后的值,
如果ID++后查询到当前全局ID不是之前获取的ID,那么重新获取全局ID++后再重复查询全局ID比较,直到查询到的ID与全局ID匹配为止
(3)CAS方式会有ABA问题:
ABA问题是指:线程A查询到全局ID=1,此时线程B做了全局ID++操作后又做了ID--操作,线程A ID++后再回来查询全局ID还是=1,这时线程A不知道全局ID被修改过了。
ABA问题解决:定义一个全局ID版本号,每次修改全局ID后都生成一个新的版本,所有线程都以ID版本号为修改依据