1. 程式人生 > >Java 中的原子操作

Java 中的原子操作

寫這篇部落格起源於一道面試題 i++ 是不是原子操作?

那到底什麼是原子操作?
所謂原子操作,就是“不可中斷的一個或一系列操作”。在確認一個操作是原子的情況下,在多執行緒環境裡,我們可以避免僅僅為保護這個操作在外圍加上效能昂貴的鎖,甚至藉助於原子操作,我們可以實現互斥鎖。

Java中有哪些原子操作呢?查詢資料後我總結出了以下幾個:

  1. 原始型別:原始型別(long 和 double 的賦值操作在32位作業系統上是非原子操作)的簡單讀取、寫入操作(i++是非原子操作)。
  2. volatile:使用volatile修飾的變數的簡單讀取、寫入操作。
  3. 原子類:原子類(例如AtomicInteger、AtomicBoolean)的讀取、寫入操作,注意incrementAndGet自增操作具有原子性。
  4. 併發鎖:使用synchronize或者Lock進行限定的併發鎖,其中的程式碼都具有原子性。

注意:volatile並不保證原子性,所以即使變數有volatile修飾,對變數的“複雜”操作並不是原子操作,即保證簡單讀取、寫入操作是原子操作。