Java內(nèi)存模型的歷史變遷_第1頁
Java內(nèi)存模型的歷史變遷_第2頁
Java內(nèi)存模型的歷史變遷_第3頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、Java內(nèi)存模型的歷史變遷發(fā)表于2015-05-20 11:00|1970次閱讀| 來源CSDN|2條評論| 作者程曉明特別策劃JavaJava20周年程序員電子刊摘要:本文通過介紹Java的新/舊內(nèi)存模型,來展示Java技術的歷史變遷。本文通過介紹Java的新/舊內(nèi)存模型,來展示Java技術的歷史變遷。舊的Java內(nèi)存模型Java使用的是共享內(nèi)存的并發(fā)模型,在線程之間共享變量。Java語言定義了線程模型規(guī)范,通過內(nèi)存模型控制線程與變量的交互,從而實現(xiàn)Java線程之間的通信。在JDK5之前,Java一直使用的是舊內(nèi)存模型。如圖1所示。變量保存在由所有線程共享的主內(nèi)存中,主內(nèi)存中的變量稱為mas

2、tingcopy。每個線程都有一個工作內(nèi)存,它保存變量的workingcopy。舊的內(nèi)存模型定義了若干規(guī)則,通過這些規(guī)則來保證線程何時將主內(nèi)存中的mastingcopy傳送到線程的工作內(nèi)存中;以及線程何時將工作內(nèi)存中的workingcopy傳送回主內(nèi)存。舊內(nèi)存模型使用8個操作來定義線程可以執(zhí)行的動作。 read(讀)操作:主內(nèi)存把mastingcopy傳送到線程的工作內(nèi)存,以供后面的load操作使用。 load(裝載)操作:線程將由read操作從主內(nèi)存?zhèn)魉瓦^來的值,放入工作內(nèi)存中。 use(使用)操作:線程將變量的workingcopy傳送到線程執(zhí)行引擎。 assign(賦值)操作:線程將變量

3、值從線程執(zhí)行引擎?zhèn)魉偷骄€程的工作內(nèi)存中。 store(存儲)操作:線程將變量的workingcopy傳送到主內(nèi)存,供后面的write操作使用。 write(寫)操作:主內(nèi)存將由store操作傳送過來的值,放入主內(nèi)存中。 lock(鎖定)操作:線程獲得指定對象的鎖。 unlock(解鎖)操作:線程釋放指定對象的鎖。圖1 Java舊內(nèi)存模型這里的關鍵是,由于read操作是由主內(nèi)存執(zhí)行,而對應的load是由線程執(zhí)行,read操作和load操作之間是松散耦合的。也就是說,主內(nèi)存和線程工作內(nèi)存之間的變量傳遞是松散耦合的。同樣,由于store操作是由線程執(zhí)行,而對應的write是由主內(nèi)存執(zhí)行,store操

4、作和write操作之間是松散耦合的。也就是說,線程工作內(nèi)存和主內(nèi)存之間的變量傳遞是松散耦合的。舊Java內(nèi)存模型對Java實現(xiàn)如何執(zhí)行變量的讀/寫,加鎖/解鎖,以及volatile變量的讀/寫,定義了非常嚴格的規(guī)則。這些規(guī)則非常復雜,具體詳情請參考JVM規(guī)范,這里就不贅述了。舊Java內(nèi)存模型通過這些復雜的規(guī)則,來保證多線程程序的線程之間,可以可靠地傳遞共享變量,從而保證多線程程序的正確性。新的Java內(nèi)存模型從JDK5開始,Java使用新的內(nèi)存模型,新內(nèi)存模型完全拋棄了舊內(nèi)存模型的主內(nèi)存和工作內(nèi)存的概念,也拋棄了舊內(nèi)存模型的8個內(nèi)存操作。也就是說,新內(nèi)存模型完全是重新設計的。新內(nèi)存模型引入了

5、一個新的概念,叫happens-before。happens-before的概念最初由LeslieLamport在其一篇影響深遠的論文(Time,ClocksandtheOrderingofEventsinaDistributedSystem)中提出。LeslieLamport使用happens-before來定義分布式系統(tǒng)中,事件之間的一個偏序關系(partialordering)。LeslieLamport在這篇論文中給出了一個分布式算法,該算法可以將該偏序關系擴展為某種全序關系。JSR-133使用happens-before的概念來指定兩個操作(這里的操作是指程序中對變量的讀/寫,對鎖的

6、加鎖和解鎖)之間的執(zhí)行順序。新內(nèi)存模型定義了如下的happens-before規(guī)則。 程序順序規(guī)則:一個線程中的每個操作,happensbefore于該線程中的任意后續(xù)操作。 監(jiān)視器鎖規(guī)則:對一個鎖的解鎖,happens-before于隨后對這個鎖的加鎖。 volatile變量規(guī)則:對一個volatile域的寫,happensbefore于任意后續(xù)對這個volatile域的讀。 傳遞性:如果Ahappens-beforeB,且BhappensbeforeC,那么Ahappens-beforeC。 start()規(guī)則:如果線程A執(zhí)行操作ThreadB.start()(啟動線程B),那么A線程的T

7、hreadB.start()操作happensbefore于線程B中的任意操作。 join()規(guī)則:如果線程A執(zhí)行操作ThreadB.join()并成功返回,那么線程B中的任意操作happens-before于線程A從ThreadB.join()操作成功返回。由于兩個操作可以在一個線程之內(nèi),也可以是在不同線程之間。因此JMM可以通過happens-before關系向程序員提供跨線程的內(nèi)存可見性保證(如果A線程的寫操作a與B線程的讀操作b之間存在happens-before關系,盡管a操作和b操作在不同的線程中執(zhí)行,但JMM圖2新內(nèi)存模型的設計示意圖向程序員保證a操作將對b操作可見)。在新內(nèi)存模型向程序員提供happens-before規(guī)則,程序員只需要與happens-before打交道即可,因此Java程序員的學習負擔大大降低。同時,新內(nèi)存模型允許不會改變程序結果的重排序,這可以最大限度地放松對編

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論