java內存對象模型

      JVM規範定義了java內存模型(Java memory Model )來屏蔽掉各類操做系統、虛擬機實現廠商和硬件的內存訪問差別,以確保java程序在全部操做系統和平臺上可以實現一次編寫、處處運行的效果。java

      java 內存模型的指定既要嚴謹,保證語義無歧義,還要儘可能制定的寬鬆一些,容許各硬件和虛擬機實現廠商有足夠的靈活性來充分利用硬件的特性提高java的內存訪問性能。睡着JDK的發展,java的內存模型已經逐漸成熟起來。web

1.工做內容和主內存服務器

      java內存模型規定全部的變量都存儲在主內存中(JVM內存的一部分),每一個線程有本身獨立的工做內存,它保存了被該線程使用的變量的主內存複製。線程對這些變量的操做都在本身的工做內存中進行,不能直接操做主內存和其餘工做內存彙總存儲的變量或者變量副本。線程間的變量訪問需經過主內存來完成,三者的關係如圖所示:
多線程





2. Java內存交互協議 
      Java內存模型定義了8種操做來完成主內存和工做內存的變量訪問,具體以下:併發

  • lock: 主內存變量,把一個變量標識爲某個線程獨佔的狀態。性能

  • unlock: 主內存變量,把一個處於鎖定狀態的變量釋放出來,被釋放後的變量才能夠被其餘線程鎖定。spa

  • read:主內存變量,把一個變量的值從主內存傳輸到線程的工做內存中,以便隨後的load動做使用。操作系統

  • load:工做內存變量,把read讀取到的主內存中的變量值放入工做內存的變量副本中。線程

  • use:工做內存變量,把工做內存中的變量的值傳遞給JAVA虛擬機執行引擎,每當虛擬機遇到一個須要使用到變量值的字節碼指令時,將會執行該操做。orm

  • assign:工做內存變量,把從執行引擎接受到的變量的值賦值給工做變量,每當虛擬機遇到一個給變量賦值的字節碼時,將會執行該操做。

  • store:工做內存變量,把工做內存中一個變量的值傳送到主內存中,以便隨後的write操做使用

  • write:主內存變量,把store操做從工做內存中獲得的變量值放入主內存的變量中。

3.java的線程

      併發能夠經過多種方式來實現,例如:單進程—單線程模型,經過在一臺服務器上啓動多個進程來實現多任務的並行處理。可是在JAVA語言中,一般是經過單進程—多線程的模型進行多任務的併發處理。所以,咱們有必要熟悉一下java的線程。 
你們都知道,線程是比進程更輕量級的調度執行單元,它能夠把進程的資源分配和調度執行分開,各個線程能夠共享內存、I/O等操做系統資源,可是又可以被操做系統發起的內核線程或者進程執行。各線程能夠獨立的啓動、運行和中止,實現任務的解耦。 
      主流的操做系統提供了線程實現,目前實現線程的方式主要有三種,分別以下。 
(1) 內核線程(KLT)實現,這種線程有內核來完成線程切換,內核經過線程調度器對線程進行調度,並負責將線程任務映射到不通的處理器上。 
(2)用戶線程實現(UT),一般狀況下,用戶線程指的是徹底創建在用戶空間線程庫上的線程,用戶線程的建立、啓動、運行、銷燬和切換徹底在用戶態中完成,不須要內核的幫助,所以執行性能更高 
(3)混合實現,將內核線程和用戶線程混合在一塊兒使用的方式。

       因爲虛擬機規範並無強制規定java的線程必須使用哪一種方式實現,所以,不一樣的操做系統實現的方式也可能存在差別。對於SUNJDK,在WindowsLinux操做系統上採用了內核線程的實現方式,在Solaris版本的JDK中,提供了一些專有的虛擬機線程參數,用於設置使用哪一種線程模型。

相關文章
相關標籤/搜索