久草最新视频-久草最新网址-久国产-久国产视频-天天插夜夜操-天天插一插

Java內(nèi)存模型的歷史變遷



舊的Java內(nèi)存模型
Java使用的是共享內(nèi)存的并發(fā)模型,在線程之間共享變量。Java語(yǔ)言定義了線程模型規(guī)范,通過(guò)內(nèi)存模型控制線程與變量的交互,從而實(shí)現(xiàn)Java線程之間的通信。在JDK5之前,Java一直使用的是舊內(nèi)存模型。如圖1所示。變量保存在由所有線程共享的主內(nèi)存中,主內(nèi)存中的變量稱為mastingcopy。每個(gè)線程都有一個(gè)工作內(nèi)存,它保存變量的workingcopy。舊的內(nèi)存模型定義了若干規(guī)則,通過(guò)這些規(guī)則來(lái)保證線程何時(shí)將主內(nèi)存中的mastingcopy傳送到線程的工作內(nèi)存中;以及線程何時(shí)將工作內(nèi)存中的workingcopy傳送回主內(nèi)存。舊內(nèi)存模型使用8個(gè)操作來(lái)定義線程可以執(zhí)行的動(dòng)作。
read(讀)操作:主內(nèi)存把mastingcopy傳送到線程的工作內(nèi)存,以供后面的load操作使用。
load(裝載)操作:線程將由read操作從主內(nèi)存?zhèn)魉瓦^(guò)來(lái)的值,放入工作內(nèi)存中。
use(使用)操作:線程將變量的workingcopy傳送到線程執(zhí)行引擎。
assign(賦值)操作:線程將變量值從線程執(zhí)行引擎?zhèn)魉偷骄程的工作內(nèi)存中。
store(存儲(chǔ))操作:線程將變量的workingcopy傳送到主內(nèi)存,供后面的write操作使用。
write(寫)操作:主內(nèi)存將由store操作傳送過(guò)來(lái)的值,放入主內(nèi)存中。
lock(鎖定)操作:線程獲得指定對(duì)象的鎖。
unlock(解鎖)操作:線程釋放指定對(duì)象的鎖。
 
圖1 Java舊內(nèi)存模型
這里的關(guān)鍵是,由于read操作是由主內(nèi)存執(zhí)行,而對(duì)應(yīng)的load是由線程執(zhí)行,read操作和load操作之間是松散耦合的。也就是說(shuō),主內(nèi)存和線程工作內(nèi)存之間的變量傳遞是松散耦合的。同樣,由于store操作是由線程執(zhí)行,而對(duì)應(yīng)的write是由主內(nèi)存執(zhí)行,store操作和write操作之間是松散耦合的。也就是說(shuō),線程工作內(nèi)存和主內(nèi)存之間的變量傳遞是松散耦合的。舊Java內(nèi)存模型對(duì)Java實(shí)現(xiàn)如何執(zhí)行變量的讀/寫,加鎖/解鎖,以及volatile變量的讀/寫,定義了非常嚴(yán)格的規(guī)則。這些規(guī)則非常復(fù)雜,具體詳情請(qǐng)參考《JVM規(guī)范》,這里就不贅述了。舊Java內(nèi)存模型通過(guò)這些復(fù)雜的規(guī)則,來(lái)保證多線程程序的線程之間,可以可靠地傳遞共享變量,從而保證多線程程序的正確性。
新的Java內(nèi)存模型
從JDK5開始,Java使用新的內(nèi)存模型,新內(nèi)存模型完全拋棄了舊內(nèi)存模型的主內(nèi)存和工作內(nèi)存的概念,也拋棄了舊內(nèi)存模型的8個(gè)內(nèi)存操作。也就是說(shuō),新內(nèi)存模型完全是重新設(shè)計(jì)的。
新內(nèi)存模型引入了一個(gè)新的概念,叫happens-before。happens-before的概念最初由LeslieLamport在其一篇影響深遠(yuǎn)的論文(《Time,ClocksandtheOrderingofEventsinaDistributedSystem》)中提出。LeslieLamport使用happens-before來(lái)定義分布式系統(tǒng)中,事件之間的一個(gè)偏序關(guān)系(partialordering)。LeslieLamport在這篇論文中給出了一個(gè)分布式算法,該算法可以將該偏序關(guān)系擴(kuò)展為某種全序關(guān)系。
JSR-133使用happens-before的概念來(lái)指定兩個(gè)操作(這里的操作是指程序中對(duì)變量的讀/寫,對(duì)鎖的加鎖和解鎖)之間的執(zhí)行順序。新內(nèi)存模型定義了如下的happens-before規(guī)則。
程序順序規(guī)則:一個(gè)線程中的每個(gè)操作,happensbefore于該線程中的任意后續(xù)操作。
監(jiān)視器鎖規(guī)則:對(duì)一個(gè)鎖的解鎖,happens-before于隨后對(duì)這個(gè)鎖的加鎖。
volatile變量規(guī)則:對(duì)一個(gè)volatile域的寫,happensbefore于任意后續(xù)對(duì)這個(gè)volatile域的讀。
傳遞性:如果Ahappens-beforeB,且BhappensbeforeC,那么Ahappens-beforeC。
start()規(guī)則:如果線程A執(zhí)行操作ThreadB.start()(啟動(dòng)線程B),那么A線程的ThreadB.start()操作happensbefore于線程B中的任意操作。
join()規(guī)則:如果線程A執(zhí)行操作ThreadB.join()并成功返回,那么線程B中的任意操作happens-before于線程A從ThreadB.join()操作成功返回。
由于兩個(gè)操作可以在一個(gè)線程之內(nèi),也可以是在不同線程之間。因此JMM可以通過(guò)happens-before關(guān)系向程序員提供跨線程的內(nèi)存可見(jiàn)性保證(如果A線程的寫操作a與B線程的讀操作b之間存在happens-before關(guān)系,盡管a操作和b操作在不同的線程中執(zhí)行,但JMM
 
圖2新內(nèi)存模型的設(shè)計(jì)示意圖
向程序員保證a操作將對(duì)b操作可見(jiàn))。在新內(nèi)存模型向程序員提供happens-before規(guī)則,程序員只需要與happens-before打交道即可,因此Java程序員的學(xué)習(xí)負(fù)擔(dān)大大降低。同時(shí),新內(nèi)存模型允許不會(huì)改變程序結(jié)果的重排序,這可以最大限度地放松對(duì)編譯器和處理器的束縛,新內(nèi)存模型的執(zhí)行性能比舊內(nèi)存模型要好。
北大青鳥網(wǎng)上報(bào)名
北大青鳥招生簡(jiǎn)章
主站蜘蛛池模板: 一区二区三区欧美 | 亚洲视频在线免费看 | 国产成人综合久久精品亚洲 | 日本一区二区三区久久久久 | 欧美在线视频一区 | 国产免费a | 国产精品9999久久久久 | 99尹人香蕉国产免费天天在线 | 久草热视频 | 狠狠色丁香婷婷综合尤物 | 国产精品成人一区二区三区 | 四虎海外在线永久免费看 | 五月天国产视频 | 亚洲女同在线 | 一区三区三区不卡 | 国产欧美在线观看精品一区二区 | 国产婷婷综合在线视频 | 大焦伊人 | 亚洲片在线观看 | 免费人成在线水蜜桃视频 | 国产精品国产三级在线专区 | 陈玉莲三级未删减版在线观看 | 亚洲欧美日韩中文高清一 | 日韩精品在线免费观看 | 国产高清乱码无卡女大生 | 久久综合精品国产一区二区三区 | 四虎精品影院4hutv四虎 | 全日本爽视频在线 | 日韩欧美一区二区三区在线观看 | 午夜影厅 | 亚洲一级高清在线中文字幕 | 免费一级毛片不卡在线播放 | 最近最新视频中文字幕4 | www.色香蕉| 青青青青青青 | 免费国产成人高清在线观看不卡 | 亚洲男人的天堂久久精品 | 日韩一级片免费在线观看 | www色日本 | 日韩欧美在线中文字幕 | а天堂中文最新版在线 |