通過上面一張圖我們清晰的分析線程1與線程2通信實際上通過主內存(Main Memory)實現(xiàn)的。比如,線程1自己工作線程內存(Working Memory)中的變量int a的副本刷新到主內存,然后線程2先將自己工作內存中的變量副本置為無效再從主內存中重新獲取變量副本的值,這樣就實現(xiàn)了兩個線程間的通信。這也就是線程間通信的原理。下面在詳細說一下主內存和工作內存:主內存和工作內存: Java內存模型的主要目標是定義程序中各個變量的訪問規(guī)則,即在JVM中將變量存儲到內存和從內存中取出變量這樣的底層細節(jié)。此處的變量與Java編程里面的變量有所不同步,它包含了實例字段、靜態(tài)字段和構成數(shù)組對象的元素,但不包含局部變量和方法參數(shù),因為后者是線程私有的,不會共享,當然不存在數(shù)據(jù)競爭問題(如果局部變量是一個reference引用類型,它引用的對象在Java堆中可被各個線程共享,但是reference引用本身在Java棧的局部變量表中,是線程私有的)。為了獲得較高的執(zhí)行效能,Java內存模型并沒有限制執(zhí)行引起使用處理器的特定寄存器或者緩存來和主內存進行交互,也沒有限制即時編譯器進行調整代碼執(zhí)行順序這類優(yōu)化措施。 JMM規(guī)定了所有的變量都存儲在主內存(Main Memory)中。每個線程還有自己的工作內存(Working Memory),線程的工作內存中保存了該線程使用到的變量的主內存的副本拷貝,線程對變量的所有操作(讀取、賦值等)都必須在工作內存中進行,而不能直接讀寫主內存中的變量(volatile變量仍然有工作內存的拷貝,但是由于它特殊的操作順序性規(guī)定,所以看起來如同直接在主內存中讀寫訪問一般)。不同的線程之間也無法直接訪問對方工作內存中的變量,線程之間值的傳遞都需要通過主內存來完成。新聞熱點
疑難解答