java 原子类能做什么_Java原子类中可以靠版本号比较为什么还需要CAS操作??
生活随笔
收集整理的這篇文章主要介紹了
java 原子类能做什么_Java原子类中可以靠版本号比较为什么还需要CAS操作??
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我覺得java的AtomicStampedReference確實蠻坑爹的,每次cas不管成功失敗都會new出一個對象,性能有一定影響。最好的解法是像c++的folly庫一樣能偷64位指針的高16位做stamp,但是java語言層面規定的太死,玩不了這種hack。
不要用Reference,而用數組下標做指針,用Atomic記錄下標,偷高位的bit做stamp,可以繞開AtomicStampedReference,但這樣GC又成了問題...反正挺麻煩的。
ABA給你舉個例子你就懂了,假如我有個鏈表W->X->Y->Z,我要刪除X,如果我只做
W.next.CompareAndSet(X, X.next)的話,如果這個線程CAS前被掛起,另一個線程刪掉了X,X被GC了,又另一個線程new了個node,叫nX好了,插入到W和Y中間,而剛好分配給他X原來的地址,鏈表就變成了 W->nX->Y->Z,這時候第一個線程醒了,CompareAndSet仍然會成功,因為X和nX地址一樣,就把nX刪掉了,而邏輯上X和nX是不同的node,第一個線程邏輯正確的操作是不去動鏈表,返回false(沒找到X)。如果用了StampedReference每次修改以后stamp+1,就可以避免這種情況。
總結
以上是生活随笔為你收集整理的java 原子类能做什么_Java原子类中可以靠版本号比较为什么还需要CAS操作??的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信用卡附属卡有什么用
- 下一篇: 建信融通是干嘛的