1. 程式人生 > 實用技巧 >MongoDB——linux下mongo4.4分片配置檔案備份

MongoDB——linux下mongo4.4分片配置檔案備份

技術標籤:Java併發程式設計(多執行緒)

CAS樂觀鎖(原子操作)

鎖主要分為兩種:樂觀鎖和悲觀鎖,而 synchronized 就屬於一種悲觀鎖,每次在操作資料前都會加鎖。樂觀鎖是指:樂觀的認為自己在操作資料時,別人不會對當前資料進行修改,因此不會加鎖。如果有人對資料進行了修改,則重新獲取修改後的資料,進行操作。直到成功為止。而樂觀鎖的這種機制就是CAS(compare and swap)比較並交換。

一、什麼是 CAS


CAS(Compare And Swap | Compare And Set)**:**比較並交換,CAS 是解決多執行緒並行情況下使用鎖造成效能消耗的一種機制。CAS 操作包含三個運算元:記憶體位置(V)、預期值(A)、新值(B)。如果記憶體位置的值(V)與逾期原值(A)相同,處理器會將該位置的值更新為新值(B)則 CAS 操作成功。否則,處理器不做任何更改,只需要將當前位置的值進行返回即可。在 Java 可以通過鎖和迴圈 CAS 的方式來實現原子操作。Java 中 java.util.concurrent.atomic

包相關類就是 CAS 的實現。我們就舉一個整數的例子:
【1】**程式碼解析:AtomicInteger:**通常情況下,在 Java中,i++ 等類似操作並不是執行緒安全的,因為 i++ 可分為三個獨立的操作:獲取變數當前值,為該值+1,然後寫回新的值。在多執行緒的情況下 +1000 得到的值往往是不正確的。即使變數被 volatile 修飾,但可以用原子方式 AtomicInteger 自增,這樣可以保證資料的原子性。程式碼如下:

建議:必須具備 volatile 的基本知識,因為 AtomicInteger是 volatile 不具備原子性的解決方案之一。

**getAndIncrement 方法:**如果當前值 == 預期值,則以原子方式將該值設定為給定的更新值。

[複製程式碼](javascript:void(0)