亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

JAVA內存模型簡述及總結

2019-11-06 06:49:28
字體:
來源:轉載
供稿:網友

簡單定義

JMM定義了java 虛擬機(JVM)在計算機內存(RAM)中的工作方式。JVM是整個計算機虛擬模型,所以JMM是隸屬于JVM的 Java內存模型定義了多線程之間共享變量的可見性以及如何在需要的時候對共享變量進行同步。原始的Java內存模型效率并不是很理想,因此Java1.5版本對其進行了重構,現在的Java8仍沿用了Java1.5的版本 主內存是線程是共享區域,每個線程都有自己的工作內存

為何要有內存模型

//我們來看這個例子public class TestA { static int a = 0, b = 0; //定義PRivate static a,b為0,public static void main(String[] args) throws InterruptedException { while(true){ Thread threadA = new Thread(new Runnable() { public void run() { a = 2; //write 2 -> a b = 1; //write 1 -> b } }); //線程1 Thread threadB = new Thread(new Runnable() { public void run() { a = 200;//write 200 -> a b = 100;//write 100 -> b } }); //線程2 threadA.start(); threadB.start(); threadA.join(); threadB.join(); //打印a,b System.out.println("a="+a+",b="+b); } } }}

想想看上面的結果會是多少? a=2,b=1? a=200,b=100? a=2,b=100? a=200,b=1? 為什么會有這種問題? 我們在代碼尾部加上

if( !((a==2 && b==1) || (a==200 && b==100)) ){ System.out.println("a="+a+",b="+b +" >>>> i="+i); break; }

輸出結果: a=2,b=100 >>>> i=128348 [Finished in 42.9s]

因為ab為共享數據而兩個線程在不斷的對它進行讀寫,沒有次序的,沒有規則的,因此會導致數據問題,那么在內存模型中數據時如何交互的呢?

數據交互

這里寫圖片描述

線程A,B從主內存中獲取共享數據,保存到自己的數據副本線程B修改且刷新數據由副本到主內存線程C獲取主內存中數據 其B與C完成了線程B向線程C發送數據的過程,也就是線程間通信

例如: 我們定義了“晚餐是魚香肉絲蓋飯”在主內存中 線程B拿到這個數據保存到數據副本中 線程B將晚餐改為“晚餐是蔥油拌面” 當線程C在18:00時,拿到主內存中的晚餐,得到的數據就是“蔥油伴面” 從而完成了線程通信 當然你也許想到了 主內存數據同步問題。線程不安全問題,不要著急下面會說到這些

線程棧與堆

當前線程所執行方法的調用信息,2個線程棧并不相互可見。 所有基本數據類型都在線程棧中保存 (boolean/char/byte/short/int/long/float/double) heap(堆)包含了Obecjt對象,無論它是哪個線程創建的都放在了heap中 如果線程棧中包含一個對象引用那么,引用將會存在stack中而對象本身依然在heap中 static修飾的變量,類都存在heap中 這里寫圖片描述

同步與可見性

對于上面代碼中例子的非線程安全,是因為我們沒有使用volatile和synchronized進行修飾,導致共享對象的可見性,線程安全性無法得到保證,數據異常

【可見性】例子:

主存包含 i = 0 ThreadA -> read -> 主存 -> i ThreadA -> copy -> i -> 數據副本 ThreadA -> write -> i = 999 -> 數據副本 ThreadB -> read -> 主存 -> i ThreadB -> copy -> i -> 數據副本 ThreadA -> write -> 數據副本i -> 主存

ThreadB獲取的 i依然為0,因為ThreadA 還沒有將數據副本寫回主存,ThreadA是在ThreadB之后寫回的數據

最終問題在于ThraedB與ThreadA沒有可見性,ThreadB 并不 happens before ThreadA

如果我們使用volatile關鍵字就不會發生這種狀況,可以保證數據直接從主存rw,當然其中原理是基于內存屏障指令來達到的(volatile只能保證可見性,但無法保證線程安全)

【同步】例子

主存包含 i = 0 ThreadA -> read -> 主存 -> i ThreadB -> read -> 主存 -> i

ThreadA -> copy -> i -> 數據副本 ThreadB -> copy -> i -> 數據副本

ThreadA -> write -> i = i + 1 -> 數據副本 ThreadB -> write -> i =i +1 -> 數據副本

從此刻來看 i 的值應該是 2 ,其實不然,如果是串行執行,自然是 i+1 , i+1 ,但多線程中往往是并行的,那么無論是ThreadB還是A,最終主存中的值只會是2

如果我們使用sync(synchronized)關鍵詞即可保證只能有一個線程在操作目標對象,避免線程安全問題,同時sync也保證數據的可見性(如同volatile),則數據也是從主存中直接r/w

synchronized 同步,可見性

volatile 非線程安全,可見性

指令重排 為了提高程序運行性能,jvm和cpu會對代碼進行重新排序 然而內存屏障指令會禁止在特定類型修飾的目標(volition,sync)中進行指令重排,以保證可見性

編譯器優化重排序:編譯器在不改變單線程程序語義的前提下,可以重新安排語句的執行順序。 指令級并行的重排序:如果不存l在數據依賴性,處理器可以改變語句對應機器指令的執行順序。 內存系統的重排序:處理器使用緩存和讀寫緩沖區,這使得加載和存儲操作看上去可能是在亂序執行。

舉個例子:

int a=1;int b=2;int c=3; Systen.out.print(a+c);

可以發現int b =2 與print并沒有依賴關系并不影響 as-if-serial原則,所以int b是可以被重排的,然而 a,c的定義也是可以重排的 但是他們一定會在print前面。

as-if-serial 原則

該原則定義了在指令重排中,無論如何重排,都不可以改變原有結果

Happens Before

從jdk5開始,java使用新的JSR-133內存模型,基于happens-before的概念來闡述操作之間的內存可見性。在JMM中,如果一個操作的執行結果需要對另一個操作可見,那么這兩個操作之間必須要存在happens-before關系,這個的兩個操作既可以在同一個線程,也可以在不同的兩個線程中。與程序員密切相關的happens-before規則如下:1.程序順序規則:一個線程中的每個操作,happens-before于該線程中任意的后續操作。2.監視器鎖規則:對一個鎖的解鎖操作,happens-before于隨后對這個鎖的加鎖操作。3.volatile域規則:對一個volatile域的寫操作,happens-before于任意線程后續對這個volatile域的讀。(內存屏障flush)4.傳遞性規則:如果 A happens-before B,且 B happens-before C,那么A happens-before C。注意:兩個操作之間具有happens-before關系,并不意味前一個操作必須要在后一個操作之前執行!僅僅要求前一個操作的執行結果,對于后一個操作是可見的

假定我們有已經被初始化的變量: int counter = 0; 這個 counter 變量被兩個線程所共有,也就是說線程A和線程B都可以獲取或者更改counter的值。 這里我們假設線程A要增加counter的值: counter++; 然后,線程B打印counter的值 System.out.println(counter); 如果上面兩條語句被同一個線程執行,我們可以肯定的說打印出來的值是1. 但是如果這兩條語句分別被兩個線程執行,其打印出來的值卻可能是0, 因為這里并沒有任何保證說線程A對counter的修改一定對線程B所見。除非我們在兩條語句之間建立起 happens-before的關系

參考資料: 《深入理解Java內存模型》 《全面理解Java內存模型》 Java多線程之happens-before


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产91久久婷婷一区二区| 国产精品99久久久久久白浆小说| 亚洲一区亚洲二区| 日本成人在线视频网址| 91国内免费在线视频| 欧美日韩一区二区在线| 国产精品日日摸夜夜添夜夜av| 疯狂做受xxxx高潮欧美日本| 亚洲午夜性刺激影院| 黑丝美女久久久| 欧美日韩福利在线观看| 日本欧美中文字幕| 亚洲色图美腿丝袜| 91精品国产99| 国产精品无av码在线观看| 国产精品精品国产| 在线播放国产一区中文字幕剧情欧美| 亚洲精品美女在线观看播放| 亚洲日韩欧美视频一区| 亚洲国产精久久久久久| 8x海外华人永久免费日韩内陆视频| 国产欧美一区二区三区视频| 成人免费观看49www在线观看| 中文字幕国产精品久久| 久久久久久久久91| 亚洲天堂av高清| 日韩精品视频免费在线观看| 欧美精品久久久久久久久| 正在播放欧美一区| 日韩网站免费观看高清| 久久精品电影一区二区| 欧美亚洲伦理www| 精品久久久久久久久久国产| 亚洲欧美另类自拍| 国产精品午夜国产小视频| 欧美肥臀大乳一区二区免费视频| 久久成人亚洲精品| 国产免费一区二区三区香蕉精| 日韩在线视频二区| 亚洲天天在线日亚洲洲精| 久久91亚洲人成电影网站| 亚洲精品一区二三区不卡| 91精品久久久久久久| 最近2019中文免费高清视频观看www99| 精品欧美一区二区三区| 久久久亚洲天堂| 国产综合在线看| 色一区av在线| 亚洲天堂成人在线视频| 97精品久久久| 国产成人综合久久| 欧美精品在线极品| 激情成人在线视频| 久久精品久久精品亚洲人| 国产婷婷成人久久av免费高清| 色噜噜亚洲精品中文字幕| 日韩精品在线观看视频| 91久久久久久国产精品| 91在线观看免费网站| 亚洲护士老师的毛茸茸最新章节| 亚洲国产精品电影| 91免费看片网站| 久久深夜福利免费观看| 欧美日韩国产精品一区| 亚洲色图综合网| 国产精品99蜜臀久久不卡二区| 欧美在线视频免费| 91久久精品美女| 中文字幕国产精品久久| 久久精品国产亚洲7777| 日本国产欧美一区二区三区| 神马久久桃色视频| 国产精品日韩电影| 国产精品老女人精品视频| 久操成人在线视频| 色悠久久久久综合先锋影音下载| 亚洲男人天堂2023| 欧美午夜精品在线| 日韩国产精品一区| 色偷偷av亚洲男人的天堂| 久久韩剧网电视剧| 欧美日韩国产成人高清视频| 日韩在线视频观看正片免费网站| 伊人久久大香线蕉av一区二区| 亚洲加勒比久久88色综合| 美女黄色丝袜一区| 91在线免费观看网站| 久久九九亚洲综合| 欧美亚洲午夜视频在线观看| 亚洲在线免费视频| 欧美性在线视频| 国产午夜精品一区二区三区| 国产视频亚洲精品| 久久综合久久八八| 久久久av电影| 亚洲色图激情小说| 成人激情免费在线| 国产精品免费久久久久影院| 色婷婷亚洲mv天堂mv在影片| 国产精品专区h在线观看| 亚洲精品福利免费在线观看| 亚洲成avwww人| 中文字幕日本精品| 综合av色偷偷网| 亚洲香蕉成视频在线观看| 国产精品自产拍在线观看中文| 国产精品www色诱视频| 午夜精品久久久久久久99黑人| 91伊人影院在线播放| 欧美激情一区二区三级高清视频| 日韩欧美综合在线视频| 午夜精品久久久久久99热软件| 亚洲电影免费观看高清完整版在线| 欧美激情第6页| 欧美夫妻性视频| 亚洲国产女人aaa毛片在线| 亚洲有声小说3d| 中文字幕日韩电影| 国产999精品视频| 亚洲精品影视在线观看| 亚洲成人免费网站| 欧洲中文字幕国产精品| 亚洲在线免费观看| 亚洲精品999| 日韩国产在线看| 91香蕉嫩草神马影院在线观看| 国产精品久久久久久久久久99| 国产日韩在线看片| 国产视频精品一区二区三区| 日韩美女福利视频| 精品欧美激情精品一区| 国产精品18久久久久久首页狼| 亚洲欧美综合精品久久成人| 亚洲国产精彩中文乱码av| 久久成年人免费电影| 国模私拍视频一区| 国产精品一香蕉国产线看观看| 欧美做爰性生交视频| 色综合久久天天综线观看| 久久99精品久久久久久琪琪| 伊人久久五月天| 在线观看精品自拍私拍| 国产性色av一区二区| 萌白酱国产一区二区| 久久香蕉国产线看观看av| 国产成人精品日本亚洲| 91视频-88av| 欧美精品一区二区免费| 亚洲电影免费观看高清完整版在线观看| 国产亚洲精品91在线| 中日韩美女免费视频网址在线观看| 97色在线视频| 欧美日韩国产中字| 欧美超级乱淫片喷水| 在线观看欧美成人| 欧美日韩国产精品专区| 日韩一区二区三区xxxx| 欧美午夜www高清视频| 伊人久久久久久久久久久| www.国产一区| 亚洲影院污污.| 成人福利网站在线观看| 在线播放日韩欧美| 亚洲亚裔videos黑人hd|