面試中經常會問的一個問題,一個關鍵字涉及的知識點其實很多。
阿里一面被問到這個問題,答得一般,這裏梳理一下。
1.Java虛擬機內存模型
懂得這一點是理解volatile的關鍵。Java虛擬機運行時數據區圖如下(盜圖莫怪):
每個線程都會有專屬的棧區,方法區和堆區爲線程共享。
這裏有個概念區分:主內存和工作內存,主內存可以理解爲共享區域,工作內存爲線程私有區域,工作內存的數據需要從主內存中加載。
特徵:
非volatile變量,僅在第一次引用時加載
volatile變量,每一次引用都需要重新從主內存中讀取加載
2.volatile保證了主內存數據對工作內存的可見性,即工作內存每次使用的數據都是主內存最新的
3.volatile無法保證線程間的可見性,所以仍然存在線程安全問題,對於存在狀態依賴 的操作需要做同步處理,保持原子性。