1. 程式人生 > >Java併發程式設計札記-(一)基礎-07volatile詳解

Java併發程式設計札記-(一)基礎-07volatile詳解

volatile同synchronized一樣,是Java中實現執行緒安全的一種機制。與synchronized相比,特點是使用簡單、效能高,但容易出錯、使用範圍有限。

《Java語言規範(第三版)》中講到: Java允許執行緒訪問共享變數,為了確保共享變數能被準確和一致的更新,執行緒應該確保通過排他鎖單獨獲得這個變數。Java提供了volatile,在某些情況下比鎖更加方便。如果一個欄位被宣告成volatile,Java執行緒記憶體模型確保所有執行緒看到這個變數的值是一致的。

Java中的volatile可以看做是“輕量級的synchronized”。synchronized可能會引起上下文切換和執行緒排程,同時保證可見性、有序性和原子性。volatile不會引起上下文切換和執行緒排程,但僅提供可見性和有序性保證,不提供原子性保證。

目錄:

  1. 相關概念
  2. synchronized鎖與volatile變數的比較
  3. volatile的使用場景

相關概念

上文中提到,volatile保證可見性和有序性,不保證原子性。這裡有幾個概念需要了解下。

原子操作與原子性
如果一系列(或者一個)操作是不可中斷的,要麼都執行,要麼不執行,就稱操作是原子操作,具有原子性。
拿移動支付舉例,A使用者向B使用者付款100元,其中包含兩個操作:A使用者賬戶扣減100元,B使用者賬戶增加100元。如果這兩個操作不是原子操作就可能會出錯,比如A賬戶賬戶扣減100元,但B使用者賬戶並沒有增加100元。

可見性
可見性指的是多個執行緒對共享資源的可見性。當一個執行緒修改了某一資源,其他執行緒能夠看到修改結果。

有序性
有效性指程式按照程式碼的先後順序執行。

synchronized鎖與volatile變數的比較

  • volatile變數最大的優點是使用方便。在某些情形下,使用volatile變數要比使用相應的synchronized鎖簡單得多。
  • 某些情況下,volatile變數同步機制的效能要優於synchronized鎖。
  • volatile變數不會像synchronized鎖一樣造成阻塞。
  • volatile變數最大的缺點在於使用範圍有限,而且容易出錯。

總的來說volatile變數使用範圍有限,不能替代synchronized,但在某些場景下,使用volatile更好。

volatile的使用場景

關於volatile的使用場景推薦閱讀正確使用 Volatile 變數一文。

volatile還是比較難理解的,本文只是簡單地做了介紹,以後隨著理解的加深會繼續完善本文。
本文暫時就講到這裡,想了解Java併發程式設計更多內容請參考:

待完善。