在上篇博客(【死磕Java并發(fā)】—–深入分析volatile的實現(xiàn)原理)LZ提到過由于存在線程本地內(nèi)存和主內(nèi)存的原因,再加上重排序,會導(dǎo)致多線程環(huán)境下存在可見性的問題。那么我們正確使用同步、鎖的情況下,線程A修改了變量a何時對線程B可見?
我們無法就所有場景來規(guī)定某個線程修改的變量何時對其他線程可見,但是我們可以指定某些規(guī)則,這規(guī)則就是happens-before,從JDK 5 開始,JMM就使用happens-before的概念來闡述多線程之間的內(nèi)存可見性。
在JMM中,如果一個操作執(zhí)行的結(jié)果需要對另一個操作可見,那么這兩個操作之間必須存在happens-before關(guān)系。
happens-before原則非常重要,它是判斷數(shù)據(jù)是否存在競爭、線程是否安全的主要依據(jù),依靠這個原則,我們解決在并發(fā)環(huán)境下兩操作之間是否可能存在沖突的所有問題。下面我們就一個簡單的例子稍微了解下happens-before ;
延伸閱讀
我想了解如何學(xué)習(xí) |