線程通信:線程之間通過共享內(nèi)存,消息傳遞的方式進行通信:共享內(nèi)存通過讀取內(nèi)存中的公共狀態(tài)來達到彼此間的通信 - 其過程是隱式的;消息傳遞則沒有公共狀態(tài)必須明確發(fā)送消息進行通信如:wait(),notify()。java線程通信是隱式的透明的。java線程通信由JMM控制。
線程改變變量的過程:每個線程都會有自己的本地內(nèi)存 - 本地內(nèi)存中的變量直接從主內(nèi)存中拷貝到自己的本地內(nèi)存中,多線程不可訪問其他線程的本地內(nèi)存,本地內(nèi)存僅自己可見。當一個線程試圖去改變主內(nèi)存中變量值得時候需經(jīng)過以下步驟:圖 -
當多個線程共享主內(nèi)存中的一個變量時 - 流程如下:
線程阿通信線程乙需經(jīng)過主內(nèi)存方可通信。共享變量
JVM對內(nèi)存(軟件層次)劃分為堆,棧:
計算機硬件內(nèi)存與JVM內(nèi)存:
當在多線程情況下若沒有對線程進行同步則:
? ? ? 線程甲從內(nèi)存讀取數(shù)據(jù)?到JVM中,線程甲對數(shù)據(jù)?進行修改但是未刷新到內(nèi)存中去;此時線程乙又從內(nèi)存中讀取數(shù)據(jù)T,此時數(shù)據(jù)?并不是線程甲修改后的值。
則此時需要使用synchronized同步對線程進行同步,僅有一個線程對數(shù)據(jù)進行操作,其他線程等待操作結(jié)束繼續(xù)操作;使用volatile修飾變量則可以保證線程每次讀到數(shù)據(jù) 總是最新的。