多线程的CAS

CAS

Compare And Swap (Compare And Exchange) / 自旋 / 自旋锁 / 无锁

独占锁:独占锁是一种悲观锁,synchronized就是一种独占锁,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。它认为在它修改之前,一定会有其它线程去修改它,悲观锁效率很低。

乐观锁(用到的机制就是CAS):每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。它相信在它修改之前,没有其它线程去修改它。

因为经常配合循环操作,直到完成为止,所以泛指一类操作。

CAS(V, A, B) ,内存值V,期待值A, 修改值B(V 是否等于 A, 等于执行, 不等于将B赋给V)

会导致ABA问题,线程1准备用CAS将变量的值由A替换为B,在此之前,线程2将变量的值由A替换为C,又由C替换为A,然后线程1执行CAS时发现变量的值仍然为A,所以CAS成功。但实际上这时的现场已经和最初不同了,尽管CAS成功,但可能存在潜藏的问题。

解决办法(版本号 AtomicStampedReference),基础类型简单值不需要版本号

猜你喜欢

转载自www.cnblogs.com/yZzcXQ/p/Thread-CAS.html