更新時間:2022-12-07 來源:黑馬程序員 瀏覽量:
線程安全是多線程領(lǐng)域的問題,線程安全可以簡單理解為一個方法或者一個實例可以在多線程環(huán)境中使用而不會出現(xiàn)問題,常見的線程安全需要考慮的問題如下:
原子性
原因:多線程下,不同線程的指令發(fā)生了交錯導(dǎo)致的共享變量的讀寫混亂。
解決:用悲觀鎖或樂觀鎖解決,volatile 并不能解決原子性。
可見性
原因:由于編譯器優(yōu)化、或緩存優(yōu)化、或 CPU 指令重排序優(yōu)化導(dǎo)致的對共享變量所做的修改另外的線程看不到。
解決:用 volatile 修飾共享變量,能夠防止編譯器等優(yōu)化發(fā)生,讓一個線程對共享變量的修改對另一個線程可見。
有序性
起因:由于編譯器優(yōu)化、或緩存優(yōu)化、或 CPU 指令重排序優(yōu)化導(dǎo)致指令的實際執(zhí)行順序與編寫順序不一致。
解決:用 volatile 修飾共享變量會在讀、寫共享變量時加入不同的屏障,阻止其他讀寫操作越過屏障,從而達到阻止重排序的效果。
注意:
volatile 變量寫加的屏障是阻止上方其它寫操作越過屏障排到 volatile 變量寫之下
volatile 變量讀加的屏障是阻止下方其它讀操作越過屏障排到volatile 變量讀之上
volatile 讀寫加入的屏障只能防止同一線程內(nèi)的指令重排