一、并發和并行的差別
并發 多個線程同時通路同一個資源
并行 各種事情一路并行做
二、談談你對volatile的了解
1、volatile是java虛拟機提供的輕量級同步機制 保證可見性,不保證原子性,禁止指令重排序。
2、JMM
2.1什麼是線程可見性?
證明
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均不存在資料依賴關系,是以有可能發生指令重排。導緻線程擷取到了半初始化的對象。