JMM Java 內(nèi)存規(guī)范規(guī)定了
可見性? 原子性 和有序性
volatile 保證了 可見性?
不保證原子性? 、
?原子性 不可分割,某transaction 要么執(zhí)行 要么不執(zhí)行
為什么不保證原子性?
number++ 操作
三步驟:
????????一個(gè)線程先從主內(nèi)存獲得number
????????然后+1
? ?????然后寫回主內(nèi)存
? ?????如果線程 a 和 b 同時(shí)讀到0? 然后+1??
????某時(shí)刻 a寫入? b 被掛起后寫入??
????讀取速度太快,+1 操作被覆蓋
volatile 不保證原子性的問題解決
????可以使用
????AtomicInteger = new AtutomicInteger()??
(使用了CAS)
======================================
禁止指令重排?
有序性
什么是指令重排序
int x=11? //1
int y=12? //2
x=+5? ?//3
x=x*x? ?//4
指令可能重新拍成 1 2 3 4? ?、 2 1 34 、1324
不可能是 4123(編譯器進(jìn)行重排序的時(shí)候會(huì)考慮指令依賴性)
單線程環(huán)境里面確保程序最終結(jié)果和代碼順序執(zhí)行一致(不需要考慮)
多線程由于重排序,程序的結(jié)果無法得到確認(rèn)
重排的例子:


