1.三個問題:原子性問題砖茸,可見性問題侣诵,有序性問題
原子性:要么全部執(zhí)行希坚,要么全部不執(zhí)行
可見性:當多線程訪問同一個變量時边苹,一個線程改變了這個變量的值,其他線程能夠立即看得到修改的值
//線程1執(zhí)行的代碼
inti =0;
i =10;
//線程2執(zhí)行的代碼
j = i;
線程2執(zhí)行 j = i吏够,它會先去主存讀取i的值并加載到CPU2的緩存當中,注意此時內(nèi)存當中i的值還是0,那么就會使得j的值為0锅知,而不是10.
2.happens-before原則(先行發(fā)生原則):
——程序次序規(guī)則:一個線程內(nèi)播急,按照代碼順序,書寫在前面的操作先行發(fā)生于書寫在后面的操作
——鎖定規(guī)則:一個unLock操作先行發(fā)生于后面對同一個鎖額lock操作
——volatile變量規(guī)則:對一個變量的寫操作先行發(fā)生于后面對這個變量的讀操作
——傳遞規(guī)則:如果操作A先行發(fā)生于操作B售睹,而操作B又先行發(fā)生于操作C桩警,則可以得出操作A先行發(fā)生于操作C
——線程啟動規(guī)則:Thread對象的start()方法先行發(fā)生于此線程的每個一個動作
——線程中斷規(guī)則:對線程interrupt()方法的調(diào)用先行發(fā)生于被中斷線程的代碼檢測到中斷事件的發(fā)生
——線程終結(jié)規(guī)則:線程中所有的操作都先行發(fā)生于線程的終止檢測,我們可以通過Thread.join()方法結(jié)束昌妹、Thread.isAlive()的返回值手段檢測到線程已經(jīng)終止執(zhí)行
——對象終結(jié)規(guī)則:一個對象的初始化完成先行發(fā)生于他的finalize()方法的開始
3.volatile:(無法保證操作的原子性)一旦一個共享變量(類的成員變量捶枢、類的靜態(tài)成員變量)被volatile修飾之后,那么就具備了兩層語義:
1)保證了不同線程對這個變量進行操作時的可見性飞崖,即一個線程修改了某個變量的值烂叔,這新值對其他線程來說是立即可見的。
2)禁止進行指令重排序固歪。