Netty的深入淺出--78.AtomicIntegerUpdater深入理解和AtomicIntegerUpdater簡單實例

我們考慮一個問題,爲什麼netty中不使用AtomicInteger而是使用AtomicIntegerfieldUpdate。

 

一個內部類AtomicIntegerFieldUpdaterImpl

 

說一下volatile:

第一層作用:防止指令重排序,由於jvm爲了提高運行效率,在會將執行指令 進行一次重新排序,但是我們爲了防止重排序導致的數據不一致問題,就得阻止指令重排序的發送。

第二層作用:保證線程之間的可見性。簡單描述就是:假設存在一個int變量,當兩個線程同時修改他的時候,一個線程提前獲取並且修改之後,另外一個線程並不能馬上獲得修改後的值,因爲線程內部存在私有內存。所以爲了解決這個問題就得保證線程之間的可見性。(這個情況的發送的前提條件是在很短很短的情況下產生的)

所以自旋鎖裏面的原子操作必須是有volatile修飾的變量。

 

創建一個實例來認識AtomicIntegerUpdater:

 

 

 使用atomicintegerupdater

輸出結果:

 

 運行報錯must be volatile type

 修改

 

回答上一章問題 ,問什麼netty不採用atomicinteger而是採用atomicintegerupdater呢?

由於netty中大量使用bytebuf,就會有無數到bytebuf對象,導致每個bytebuf裏面都有一個atomicinteger,造成了大量的性能損耗。

而netty中將atomicintegerupdater設置爲靜態的,這樣的話就可以對所有的bytebuf裏面的引用計數的更新。

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