當前位置:
首頁 > 最新 > AtomicInteger 與樂觀鎖

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);

(完)

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 推酷 的精彩文章:

EA 商業遊戲新作 NBA LIVE 2018 正式出爐,籃球遊戲又迎來血戰
原來,中國的設計師一直缺一個像樣的協同工具
13 年來,我寫了這些糟糕的遊戲代碼
etcd啟動流程源碼分析筆記

TAG:推酷 |

您可能感興趣

AtomicInteger 源碼解析