volatile

volatile

java包含兩種內在的同步機制:同步塊(方法)和volatile變量。都是爲了實現代碼的安全性。

volatile是輕量的同步,與synchronized 想比它的同步性較差,但開銷低

鎖提供了兩種主要的特性

  • 互斥:一次只允許一個線程持有某個特定的鎖。 用來實現對共享數據的協調訪問協議
  • 可見性:確保釋放鎖之前對共享數據的更改,對於隨後獲得該鎖的另一個線程是可見的

volatile的作用

  • 保證內存的可見性(每次訪問變量時都會進行一次刷新,每次訪問的都是主內存中最新的數據)
  • 防止指令重排

注意:volatile不保證原子性,也不會有互斥

當讀操作遠遠大於寫操作時建議使用volatile變量而不是鎖

volatile變量的使用條件

  • 對變量的寫入操作不依賴變量的當前值,或確保只有單個線程更新變量的值
  • 變量沒有包含在具有其他變量的不變式中

volatile與synchronize的區別

  • volatile不會進行加鎖:

    volatile是一種稍弱的同步機制,在訪問volatile變量時不會進行加鎖,因此也不會執行線程阻塞。volatile是一種比synchronize更輕級的同步機制

  • volatile變量作用類似與同步變量讀寫操作:

    從內存角度看,寫入volatile變量相當與退出同步代碼塊,而讀取volatile變量相當於進入同步代碼塊

  • volatile不如synchronize安全

  • volatile只確保可見性,而鎖確既可以確保可見性又可以確保原子性:

    聲明爲volatile的簡單變量如果當前值與該變量以前的值相關,那麼volatile關鍵字不起作用(count++ , count= count+1)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章