2020-09-29:介紹volatile功能。#福大大架構師每日一題#
uj5u.com熱心網友回復:
保證可見性,不保證原子性,禁止指令重排uj5u.com熱心網友回復:
Java 提供了 volatile 關鍵字來保證可見性和禁止指令重排。 volatile 提供 happens-before 的保證,確保一個執行緒的修改能對其他執行緒是可見的。當一個共享變數被 volatile 修飾時,它會保證修改的值會立即被更新到主存,當有其他執行緒需要讀取時,它會去記憶體中讀取新值。從實踐角度而言,volatile 的一個重要作用就是和 CAS 結合,保證了原子性,詳細的可以參見 java.util.concurrent.atomic 包下的類,比如 AtomicInteger。
volatile 常用于多執行緒環境下的單次操作(單次讀或者單次寫)。
關鍵字volatile的主要作用是使變數在多個執行緒間可見,但無法保證原子性,對于多個執行緒訪問同一個實體變數需要加鎖進行同步。
volatile 表示變數在 CPU 的暫存器中是不確定的,必須從主存中讀取。保證多執行緒環境下變數的可見性;禁止指令重排序。
volatile與synchronized的 區別:
- volatile 是變數修飾符;synchronized 可以修飾類、方法、變數。
- volatile 僅能實作變數的修改可見性,不能保證原子性;而 synchronized 則可以保證變數的修改可見性和原子性。
- volatile 不會造成執行緒的阻塞;synchronized 可能會造成執行緒的阻塞。
- volatile標記的變數不會被編譯器優化;synchronized標記的變數可以被編譯器優化。
- volatile關鍵字是執行緒同步的輕量級實作,所以volatile性能肯定比synchronized關鍵字要好。但是volatile關鍵字只能用于變數而synchronized關鍵字可以修飾方法以及代碼塊。synchronized關鍵字在JavaSE1.6之后進行了主要包括為了減少獲得鎖和釋放鎖帶來的性能消耗而引入的偏向鎖和輕量級鎖以及其它各種優化之后執行效率有了顯著提升,實際開發中使用 synchronized 關鍵字的場景還是更多一些。
uj5u.com熱心網友回復:
保證被修飾的變數對應多執行緒是可見的,還可以控制CPU的指令重排,保證執行緒的執行順序uj5u.com熱心網友回復:
修飾公共變數,保證變數在多執行緒環境中保證可見性和有序性。uj5u.com熱心網友回復:
https://blog.csdn.net/weixin_43876121/article/details/107445595轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/139149.html
標籤:Java相關
