CAS操作
貼一個 AtomicInteger 實現主要原理,
AtomicInteger 類解釋:
- private volatile int value; value設置爲volatile 是保證內存可見性,杜絕緩存一致性問題,不管哪個cpu讀取到的都是內存最新值而不是cpu自己緩存的值。
- unsafe是直接操作內存的一個類,參考:https://www.jianshu.com/p/db8dce09232d
- unsafe.getAndSetInt(this, valueOffset, newValue):
- this, valueOffset:當前類,偏移量,這倆個值直接確定內存地址。
- 每個field的偏移量是根據當前類型(Class)來的。java對象內存佈局參考 https://blog.csdn.net/qq_30054961/article/details/88345030、https://www.cnblogs.com/plxx/p/4642405.html
Unsafe類解釋:
- var5 = this.getIntVolatile(var1, var2); 獲取操作前的數值 (也就是該內存地址現在的數值)。
- while(!this.compareAndSwapInt(var1, var2, var5, var4)) 一直嘗試cas操作。
- var1,var2 直接確定內存地址。
- var5 當前值
- var4 目標值
- compareAndSwapInt(CAS)操作含義 var1、var2 所在內存地址的值如果等於var5 就將該內存地址設值爲 var4.