更新時(shí)間:2022-12-07 來(lái)源:黑馬程序員 瀏覽量:
IT就到黑馬程序員.gif)
線程安全是多線程領(lǐng)域的問(wèn)題,線程安全可以簡(jiǎn)單理解為一個(gè)方法或者一個(gè)實(shí)例可以在多線程環(huán)境中使用而不會(huì)出現(xiàn)問(wèn)題,常見(jiàn)的線程安全需要考慮的問(wèn)題如下:
原子性
原因:多線程下,不同線程的指令發(fā)生了交錯(cuò)導(dǎo)致的共享變量的讀寫(xiě)混亂。
解決:用悲觀鎖或樂(lè)觀鎖解決,volatile 并不能解決原子性。
可見(jiàn)性
原因:由于編譯器優(yōu)化、或緩存優(yōu)化、或 CPU 指令重排序優(yōu)化導(dǎo)致的對(duì)共享變量所做的修改另外的線程看不到。
解決:用 volatile 修飾共享變量,能夠防止編譯器等優(yōu)化發(fā)生,讓一個(gè)線程對(duì)共享變量的修改對(duì)另一個(gè)線程可見(jiàn)。
有序性
起因:由于編譯器優(yōu)化、或緩存優(yōu)化、或 CPU 指令重排序優(yōu)化導(dǎo)致指令的實(shí)際執(zhí)行順序與編寫(xiě)順序不一致。
解決:用 volatile 修飾共享變量會(huì)在讀、寫(xiě)共享變量時(shí)加入不同的屏障,阻止其他讀寫(xiě)操作越過(guò)屏障,從而達(dá)到阻止重排序的效果。
注意:
volatile 變量寫(xiě)加的屏障是阻止上方其它寫(xiě)操作越過(guò)屏障排到 volatile 變量寫(xiě)之下
volatile 變量讀加的屏障是阻止下方其它讀操作越過(guò)屏障排到volatile 變量讀之上
volatile 讀寫(xiě)加入的屏障只能防止同一線程內(nèi)的指令重排
1024首播|39歲程序員逆襲記:不被年齡定義,AI浪潮里再迎春天
2025-10-241024程序員節(jié)丨10年同行,致敬用代碼改變世界的你
2025-10-24【AI設(shè)計(jì)】北京143期畢業(yè)僅36天,全員拿下高薪offer!黑馬AI設(shè)計(jì)連續(xù)6期100%高薪就業(yè)
2025-09-19【跨境電商運(yùn)營(yíng)】深圳跨境電商運(yùn)營(yíng)畢業(yè)22個(gè)工作日,就業(yè)率91%+,最高薪資達(dá)13500元
2025-09-19【AI運(yùn)維】鄭州運(yùn)維1期就業(yè)班,畢業(yè)14個(gè)工作日,班級(jí)93%同學(xué)已拿到Offer, 一線均薪資 1W+
2025-09-19【AI鴻蒙開(kāi)發(fā)】上海校區(qū)AI鴻蒙開(kāi)發(fā)4期5期,距離畢業(yè)21天,就業(yè)率91%,平均薪資14046元
2025-09-19