国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Java內存模型的歷史變遷

瀏覽:8日期:2022-09-06 08:42:57

本文通過介紹Java的新/舊內存模型,來展示Java技術的歷史變遷。

舊的Java內存模型

Java使用的是共享內存的并發模型,在線程之間共享變量。Java語言定義了線程模型規范,通過內存模型控制線程與變量的交互,從而實現Java線程之間的通信。在JDK5之前,Java一直使用的是舊內存模型。如圖1所示。變量保存在由所有線程共享的主內存中,主內存中的變量稱為mastingcopy。每個線程都有一個工作內存,它保存變量的workingcopy。舊的內存模型定義了若干規則,通過這些規則來保證線程何時將主內存中的mastingcopy傳送到線程的工作內存中;以及線程何時將工作內存中的workingcopy傳送回主內存。舊內存模型使用8個操作來定義線程可以執行的動作。

read(讀)操作:主內存把mastingcopy傳送到線程的工作內存,以供后面的load操作使用。load(裝載)操作:線程將由read操作從主內存傳送過來的值,放入工作內存中。use(使用)操作:線程將變量的workingcopy傳送到線程執行引擎。assign(賦值)操作:線程將變量值從線程執行引擎傳送到線程的工作內存中。store(存儲)操作:線程將變量的workingcopy傳送到主內存,供后面的write操作使用。write(寫)操作:主內存將由store操作傳送過來的值,放入主內存中。lock(鎖定)操作:線程獲得指定對象的鎖。unlock(解鎖)操作:線程釋放指定對象的鎖。

Java內存模型的歷史變遷

圖1 Java舊內存模型

這里的關鍵是,由于read操作是由主內存執行,而對應的load是由線程執行,read操作和load操作之間是松散耦合的。也就是說,主內存和線程工作內存之間的變量傳遞是松散耦合的。同樣,由于store操作是由線程執行,而對應的write是由主內存執行,store操作和write操作之間是松散耦合的。也就是說,線程工作內存和主內存之間的變量傳遞是松散耦合的。舊Java內存模型對Java實現如何執行變量的讀/寫,加鎖/解鎖,以及volatile變量的讀/寫,定義了非常嚴格的規則。這些規則非常復雜,具體詳情請參考《JVM規范》,這里就不贅述了。舊Java內存模型通過這些復雜的規則,來保證多線程程序的線程之間,可以可靠地傳遞共享變量,從而保證多線程程序的正確性。

新的Java內存模型

從JDK5開始,Java使用新的內存模型,新內存模型完全拋棄了舊內存模型的主內存和工作內存的概念,也拋棄了舊內存模型的8個內存操作。也就是說,新內存模型完全是重新設計的。

新內存模型引入了一個新的概念,叫happens-before。happens-before的概念最初由LeslieLamport在其一篇影響深遠的論文(《Time,ClocksandtheOrderingofEventsinaDistributedSystem》)中提出。LeslieLamport使用happens-before來定義分布式系統中,事件之間的一個偏序關系(partialordering)。LeslieLamport在這篇論文中給出了一個分布式算法,該算法可以將該偏序關系擴展為某種全序關系。

JSR-133使用happens-before的概念來指定兩個操作(這里的操作是指程序中對變量的讀/寫,對鎖的加鎖和解鎖)之間的執行順序。新內存模型定義了如下的happens-before規則。

程序順序規則:一個線程中的每個操作,happensbefore于該線程中的任意后續操作。監視器鎖規則:對一個鎖的解鎖,happens-before于隨后對這個鎖的加鎖。volatile變量規則:對一個volatile域的寫,happensbefore于任意后續對這個volatile域的讀。傳遞性:如果Ahappens-beforeB,且BhappensbeforeC,那么Ahappens-beforeC。start()規則:如果線程A執行操作ThreadB.start()(啟動線程B),那么A線程的ThreadB.start()操作happensbefore于線程B中的任意操作。join()規則:如果線程A執行操作ThreadB.join()并成功返回,那么線程B中的任意操作happens-before于線程A從ThreadB.join()操作成功返回。

由于兩個操作可以在一個線程之內,也可以是在不同線程之間。因此JMM可以通過happens-before關系向程序員提供跨線程的內存可見性保證(如果A線程的寫操作a與B線程的讀操作b之間存在happens-before關系,盡管a操作和b操作在不同的線程中執行,但JMM

Java內存模型的歷史變遷

圖2新內存模型的設計示意圖

向程序員保證a操作將對b操作可見)。在新內存模型向程序員提供happens-before規則,程序員只需要與happens-before打交道即可,因此Java程序員的學習負擔大大降低。同時,新內存模型允許不會改變程序結果的重排序,這可以最大限度地放松對編譯器和處理器的束縛,新內存模型的執行性能比舊內存模型要好。

作者簡介:程曉明Java軟件工程師,關注并發與NIO,《深入理解Java內存模型》的作者?,F就職于南京富士通南大軟件技術有限公司,從事富士通Interstage應用服務器的開發。

標簽: Java
相關文章:
主站蜘蛛池模板: 午夜三级网 | 亚洲欧美一区二区三区国产精品 | 国产精品亚洲第五区在线 | 亚洲另类激情综合偷自拍 | 国产片网址 | 亚洲成人国产精品 | 久久在线视频免费观看 | 日本三本道 | 最新更新国内自拍视频 | 女教师的一级毛片 | 欧美成人午夜片一一在线观看 | 亚洲综合色一区二区三区另类 | 久久99热精品免费观看k影院 | 欧美一区二区在线观看 | 国产美女一区二区在线观看 | 亚洲综合性 | 欧美成人26uuu欧美毛片 | 欧美5g影院天天爽天天看 | 男人的天堂久久 | 久久伊人成人网 | 高级毛片| 欧美一级棒 | 成人精品一区二区不卡视频 | 亚洲国产视频在线 | 成年人在线观看视频免费 | 久草在线视频在线 | 国产欧美日韩视频免费61794 | 韩国精品视频在线观看 | 国产蜜汁tv福利在线 | 国产美女视频做爰 | 久色网址 | 小草青青神马影院 | 国产91丝袜美腿在线观看 | 亚洲日本欧美产综合在线 | 国产精品揄拍一区二区久久 | 成人爱爱网站在线观看 | 亚洲精品视频区 | 亚洲一区二区在线免费观看 | 欧美在线成人午夜网站 | 色综合a | 成人毛片免费免费 |