AtomicInteger 與樂觀鎖
今天,來分享下 AtomicInteger 與樂觀鎖。
AtomicInteger 是支持原子操作的 Integer 類,它採用基於 CAS 的樂觀鎖實現。樂觀鎖,顧名思義,採取樂觀的態度,每次操作都假設不會發生並發衝突,因此不會上鎖,只在更新操作時檢查是否違反數據完整性,換句話說,在更新操作時判斷在此期間別人是否更新這個數據。如果發現並發衝突,則讓拋出錯誤的信息,讓用戶決定如何去做。
首先,我們先閱讀下 incrementAndGet() 方法。其中,這個方法中,先獲取到當前的 current 值,然後將 current 加 1,賦值給一個局部的 next 變數,但是,這兩步都是非線程安全的。最後一步至關重要,它調用了 compareAndSet(int expect, int update) 方法。
public final int incrementAndGet() { for (;;) { int current = get(); int next = current + 1; if (compareAndSet(current, next)) return next; } }
注意的是,其中 for 是一個死循環,通過不斷地嘗試樂觀鎖操作,直到成功才退出。
compareAndSet(int expect, int update) 方法中,調用了 compareAndSwapInt(Object var1, long var2, int var4, int var5) 方法。
public final boolean compareAndSet(int expect, int update) { return unsafe.compareAndSwapInt(this, valueOffset, expect, update); }
compareAndSwapInt(Object var1, long var2, int var4, int var5) 方法 是 native 方法,利用 JNI 調用底層其他語言實現的方法,它是基於 CPU 的 CAS 指令來實現的。
public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);
(完)
![](https://pic.pimg.tw/zzuyanan/1488615166-1259157397.png)
![](https://pic.pimg.tw/zzuyanan/1482887990-2595557020.jpg)
※EA 商業遊戲新作 NBA LIVE 2018 正式出爐,籃球遊戲又迎來血戰
※原來,中國的設計師一直缺一個像樣的協同工具
※13 年來,我寫了這些糟糕的遊戲代碼
※etcd啟動流程源碼分析筆記
TAG:推酷 |