日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

java 8大happen-before原则超全面详解

發(fā)布時間:2025/3/21 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 8大happen-before原则超全面详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

再來重復下八大原則:

  • 單線程happen-before原則:在同一個線程中,書寫在前面的操作happen-before后面的操作。
  • 鎖的happen-before原則:同一個鎖的unlock操作happen-before此鎖的lock操作。
  • volatile的happen-before原則:對一個volatile變量的寫操作happen-before對此變量的任意操作(當然也包括寫操作了)。
  • happen-before的傳遞性原則:如果A操作 happen-before B操作,B操作happen-before C操作,那么A操作happen-before C操作。
  • 線程啟動的happen-before原則:同一個線程的start方法happen-before此線程的其它方法。
  • 線程中斷的happen-before原則:對線程interrupt方法的調用happen-before被中斷線程的檢測到中斷發(fā)送的代碼。
  • 線程終結的happen-before原則:線程中的所有操作都happen-before線程的終止檢測。
  • 對象創(chuàng)建的happen-before原則:一個對象的初始化完成先于他的finalize方法調用。

首先在看本文前,最好先看下《java并發(fā)編程實戰(zhàn)》之java內存模型這篇文章,對java內存模型有個了解。
happen-before 在這里不能理解成在什么之前發(fā)生,它和時間沒有任何關系。個人感覺解釋成“生效可見于” 更準確。下面通過對這八個原則詳細解釋來加深對“生效可見于”的理解。


在同一個線程中,書寫在前面的操作happen-before后面的操作: 好多文章把這理解成書寫在前面先發(fā)生于書寫在后面的代碼,但是指令重排序,確實可以讓書寫在后面的代碼先于書寫在前面的代碼發(fā)生。這是里把happen-before 理解成“先于什么發(fā)生”,其實happen-beofre在這里沒有任何時間上的含義。比如下面的代碼:

int a = 3; //1 int b = a + 1; //2

這里 //2 對b賦值的操作會用到變量a,那么java的“單線程happen-before原則”就保證 //2的中的a的值一定是3,而不是0,5,等其他亂七八糟的值,因為//1 書寫在//2前面, //1對變量a的賦值操作對//2一定可見。因為//2 中有用到//1中的變量a,再加上java內存模型提供了“單線程happen-before原則”,所以java虛擬機不許可操作系統(tǒng)對//1 //2 操作進行指令重排序,即不可能有//2 在//1之前發(fā)生。但是對于下面的代碼:

int a = 3; int b = 4;

兩個語句直接沒有依賴關系,所以指令重排序可能發(fā)生,即對b的賦值可能先于對a的賦值。


同一個鎖的unlock操作happen-beofre此鎖的lock操作: 話不多說直接看下面的代碼:

public class A {public int var;private static A a = new A();private A(){}public static A getInstance(){return a;}public synchronized void method1(){var = 3;}public synchronized void method2(){int b = var;}public void method3(){synchronized(new A()){ //注意這里和method1 method2 用的可不是同一個鎖哦var = 4;}} } //線程1執(zhí)行的代碼: A.getInstance().method1(); //線程2執(zhí)行的代碼: A.getInstance().method2(); //線程3執(zhí)行的代碼: A.getInstance().method3();

如果某個時刻執(zhí)行完“線程1” 馬上執(zhí)行“線程2”,因為“線程1”執(zhí)行A類的method1方法后肯定要釋放鎖,“線程2”在執(zhí)行A類的method2方法前要先拿到鎖,符合“鎖的happen-before原則”,那么在“線程2”method2方法中的變量var一定是3,所以變量b的值也一定是3。但是如果是“線程1”、“線程3”、“線程2”這個順序,那么最后“線程2”method2方法中的b值是3,還是4呢?其結果是可能是3,也可能是4。的確“線程3”在執(zhí)行完method3方法后的確要unlock,然后“線程2”有個lock,但是這兩個線程用的不是同一個鎖,所以JMM這個兩個操作之間不符合八大happen-before中的任何一條,所以JMM不能保證“線程3”對var變量的修改對“線程2”一定可見,雖然“線程3”先于“線程2”發(fā)生。


對一個volatile變量的寫操作happen-before對此變量的任意操作:

volatile int a; a = 1; //1 b = a; //2

如果線程1 執(zhí)行//1,“線程2”執(zhí)行了//2,并且“線程1”執(zhí)行后,“線程2”再執(zhí)行,那么符合“volatile的happen-before原則”所以“線程2”中的a值一定是1。


如果A操作 happen-before B操作,B操作happen-before C操作,那么A操作happen-before C操作:如果有如下代碼塊:

volatile int var; int b; int c; b = 4; //1 var = 3; //2 c = var; //3 c = b; //4

假設“線程1”執(zhí)行//1 //2這段代碼,“線程2”執(zhí)行//3 //4這段代碼。如果某次的執(zhí)行順序如下:
//1 //2 //3 //4。那么有如下推導( hd(a,b)表示a happen-before b):

因為有hd(//1,//2) 、hd(//3,//4) (單線程的happen-before原則)
且hd(//2,//3) (volatile的happen-before原則)
所以有 hd(//1,//3),可導出hd(//1,//4) (happen-before原則的傳遞性)
所以變量c的值最后為4
如果某次的執(zhí)行順序如下:
//1 //3 //2// //4 那么最后4的結果就不能確定嘍。其原因是 //3 //2 直接符合上述八大原則中的任何一個,不能通過傳遞性推測出來什么。


通過對上面的四個原則的詳細解釋,省下的四個原則就比較顯而易見了。這里就不做詳細解釋了。歡迎積極留言大家一起討論。



作者:aworker
鏈接:https://www.jianshu.com/p/1508eedba54d
?

總結

以上是生活随笔為你收集整理的java 8大happen-before原则超全面详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本不卡1| 婷婷丁香综合网 | 香蕉免费在线视频 | 国产激情在线视频 | 亚洲色图二区 | 国产在线视频你懂得 | 久久中文字幕一区 | 日皮在线观看 | 欧美成人精品一区二区综合免费 | 女同亚洲精品一区二区三 | 亚洲你我色 | 久久综合久久88 | 欧美动态视频 | heyzo亚洲| 黄金网站在线观看 | 成人深夜电影 | 日本久久一区 | 麻豆久久久久久 | 国产精品视频99 | 影音先锋啪啪资源 | 欧美成人性生活片 | 91麻豆精品国产午夜天堂 | 欧美激情中文字幕 | 特级一级黄色片 | 美女张开腿让男人操 | 激情天堂网 | 一区二区三区精品免费视频 | 九九热视频在线 | 中国一级特黄毛片 | 久久久久青草 | 91国在线啪 | 免费精品在线 | 日韩黄网| 亚州福利 | 国产成人精品一区在线播放 | 欧美一区二区视频在线观看 | 国产在线高潮 | 国产午夜精品视频 | aaa在线播放| 天天色天 | 婷婷俺去也 | 久久99精品国产麻豆婷婷洗澡 | 91国产丝袜播放在线 | 国产精品久久久久久网站 | 男人操女人视频网站 | jizz日韩 | 久久婷五月天 | 欧美草草 | 少妇理论片 | www.brazzers.com| 亚洲综合丁香 | 91福利在线视频 | 成人精品视频在线观看 | 亚洲成人久久久 | 国产人妖ts重口系列网站观看 | 91.久久| 人人草在线观看 | 成人小网站 | 亚洲卡一卡二 | 无码人妻精品一区二区三应用大全 | 欧美无玛 | 网站黄色在线观看 | 最新最全av网站 | 一卡二卡在线视频 | 人妻丰满熟妇av无码区hd | 91国内精品野花午夜精品 | 欧美一区二区三区在线观看视频 | 亚洲欧美日韩中文在线 | 欧美一区二区三区电影 | 色就是色欧美 | 手机看片久久久 | 蜜臀久久精品久久久用户群体 | 中文字幕av无码一区二区三区 | 阿v天堂2014 这里有精品 | 亚洲少妇精品 | 东北少妇av | 成人a在线观看 | 华人在线视频 | 亚洲成人影音 | 久久久久久一区二区 | 五月婷婷操 | 天天天天天天天天干 | 麻豆一区二区三区精品视频 | 精品国产乱码一区二 | 成人一区二区在线观看 | 亚洲乱色熟女一区二区三区 | 午夜宅男影院 | 亚洲性网站 | 三级影片在线免费观看 | 免费av资源 | 亚洲综合免费观看高清完整版 | 中国a一片一级一片 | 久久无码人妻精品一区二区三区 | 午夜视频免费 | 国产一级片免费视频 | 五月婷婷七月丁香 | 亚洲在线资源 | 国产视频导航 | 99久久精品国产一区二区成人 |