java中的AtomicInteger的詳細原理

這個原理在網上搜索了很多都沒搞清楚真正原因,後來參照了一個帖子徹底解決了我的疑問:https://blog.csdn.net/qq_34115899/article/details/83018870

1、首先確定實例域(變量int value)在class文件中的偏移量位置。這個偏移量設置在valueOffset中,即如下代碼

2、當調用

當外部調用incrementAndGet或addAndGet等方法時,會調用下面這個方法:這個getIntVolatile方法是根據傳入的當前對象和偏移量,c++就會從主內存中尋找這個對象地址並且根據偏移量找出裏面的值域(即value),這個值也就是主內存中的最新值。

compareAndSwapInt方法有四個參數,第一個參數這個當前對象,第二個是需要操作這個對象中的值域的偏移量,第三個參數v代表當前線程的預期值,第四個參數代表需要修改爲什麼值。compareAndSwapInt方法調用c++的方法會根據你傳入的預期值和主存中的值進行比較如一樣則把主存中這個地址上的對象中指定偏移量的值改爲你傳入的新值。還有爲什麼c++就能保證這種原子性操作,是因爲cpu的指令是一條條執行的,不會多條指令對一個地址進行操作。

  CAS的缺點:
    1、出現ABA問題:Java 提供了 AtomicStampedReference 工具類,通過爲引用建立類似版本號(stamp)的方式,將值和stamp一起進行讓c++去比較,來保證 CAS 的正確性。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章