天天看點

【高頻面試題】來聊聊volatile關鍵字吧

一、并發和并行的差別

并發 多個線程同時通路同一個資源 

并行 各種事情一路并行做

二、談談你對volatile的了解

1、volatile是java虛拟機提供的輕量級同步機制   保證可見性,不保證原子性,禁止指令重排序。

2、JMM 

2.1什麼是線程可見性?

【高頻面試題】來聊聊volatile關鍵字吧

證明

【高頻面試題】來聊聊volatile關鍵字吧
【高頻面試題】來聊聊volatile關鍵字吧
【高頻面試題】來聊聊volatile關鍵字吧

2.2什麼是原子性?

  不可分割,完整性。某個線程在做某個業務的時候,中間不可以被加塞或分割。需要整體完整。

  要麼同時成功,要麼同時失敗。

為什麼volatile不保證原子性?

 多線程情況下,會出現寫覆寫,丢失資料現象。雖然加了volatile,但是來不及通知其他線程,就寫入了主記憶體中。

如何保證原子性??

①加sync

②使用juc下的atomicInteger

有序性?

volatile禁止指令重排序

例子 做試卷先做會的,再做不會的。

指令重排 ---》 編譯器優化,指令并行,記憶體系統重排序

int a,b,x,y =0;

線程1     線程2

x = a;     y=b;

b =1;      a=2;

x= 0; y=0;

指令重排後

b =1;      a=2;

x = a;     y=b;

x=2;y=1   資料錯誤,無法保證一緻性

線程安全保證

對于工作記憶體和主記憶體存在延時可見的問題

可以使用sychronized或者volatile,都可以使線程修改後立即對其他線程可見。

對于指令重排導緻的可見性問題和有序性問題。

可以利用volatile來禁止指令重排序

volatile的使用場景

 單例模式

DCL 建立對象的時候,   1.配置設定記憶體空間  2.初始化對象 3. 設定值指向對象位址    123均不存在資料依賴關系,是以有可能發生指令重排。導緻線程擷取到了半初始化的對象。