我們考慮一個問題,爲什麼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裏面的引用計數的更新。