1. 程式人生 > >Java中是如何實現原子操作的?

Java中是如何實現原子操作的?

原子(atomic)在物理上的定義是,不能被分割的最小的粒子。而在Java中,原子操作指的是不能被中斷的一個或一系列操作。那麼Java裡面是如何實現原子操作的呢?

第一個方法是迴圈CAS

先簡單說明一下什麼是CAS。
CAS即compare and swap,比較並交換。CAS操作包含三個運算元:記憶體位置(V),預期原值(A),新值(B)。比較和交換就體現在這三個運算元上面,如果記憶體位置的值與預期原值相匹配,那麼處理器會自動將新值更新到該記憶體位置,如果不匹配,處理器就不做操作。JVM中的CAS操作也正是利用了處理器提供的cmpxchg指令來實現的。
下面看一段迴圈CAS的程式碼來做進一步的瞭解:
這裡寫圖片描述


這裡寫圖片描述
最終結果不一致的原因是多個處理器同時從自己的快取中讀取變數i,各自加1後又放入記憶體,unsafeCount()方法不能保證原子性,因為多個處理器有可能同時執行i++操作,所以結果就如圖所示。
這裡寫圖片描述
從JDK 1.5開始,併發包裡提供了一些類來支援原子操作,比如剛用到的AtomicInteger類。

第二個方法是鎖

鎖機制保證了只有獲得鎖的執行緒才可以操作鎖定的記憶體區域。JVM中除了偏向鎖,其他的鎖都用了迴圈CAS的方式來獲取鎖和釋放鎖。