成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:有了解過指令重排嗎,什么是Happens-Before

開發 后端
指令重排可以保證串行語義一致,但是沒有義務保證多線程間的語義也一致**。所以在多線程下,指令重排序可能會導致一些問題。


重排序

首先,什么是重排序?計算機在執行過程中,為了提高性能,會對編譯器和編譯器做指令重排。

這么做為啥可以提高性能呢?

我們知道計算機在執行的時候都是一個個指令去執行,不同的指令可能操作的硬件不一樣,在執行的過程中可能會產生中斷,打個比方,兩個指令a和b他們操作的東西各不相同,如果加載a的時候停頓了,b就加載不到,但是實際上它們互補影響,我也可以先加載b在加載a,所以指令重排是減少停頓的一種方法,這樣大大提高了效率。

指令重排的方式

指令重排一般分為以下三種:

  • 編譯器優化重新安排語句的執行順序。
  • 指令并行重排利用指令級并行技術將多個指令并行執行,如果指令之前沒有數據依賴,處理器可以改變對應機器指令的執行順序。
  • 內存系統重排由于處理使用緩存和讀寫緩沖區,所以它們是亂序的。

指令重排可以保證串行語義一致,但是沒有義務保證多線程間的語義也一致**。所以在多線程下,指令重排序可能會導致一些問題。

順序一致性模型

順序一致性模型是一個「理論參考模型」,內存模型在設計的時候都會以順序一致性內存模型作為參考。

數據競爭

我們知道在多線程情況下,同時讀寫一個變量會導致結果的不確定性,這就存在了數據競爭,相反的如果線程在同步情況下,就不存在數據競爭。

JMM對于同步的多線程情況下,程序執行可以保證順序一致性,同步包括了使用volatile、final、synchronized等關鍵字來實現「多線程下的同步」,這里的前提正確使用它們,如果使用不當,就不能保證

什么是順序一致性模型

我們在上節給大家講了Java的內存模型,提到了內存可見性的概念,順序一致性模型它的最終目的就是保證內存的可見性。

它主要有兩大特性:

  • 一個線程中的所有操作必須按照程序的順序(代碼順序)來執行。
  • 不管線程是否同步,所有線程保持單一的執行順序并且可見,且是原子性

JMM中同步的順序一致性

在JMM中,臨界區(同步方法或同步塊)的代碼可以發生重排,但對其它線程是無感知的,這樣既提高了執行效率又不影響最終結果

JMM中未同步的順序一致性

  • JMM沒有保證未同步程序的執行結果與該程序在順序一致性中執行結果一致。
  • JMM不保證單線程內的操作會按程序的順序執行(因為指令重排)。
  • JMM不保證所有線程能看到一致的操作執行順序(因為不能保證所以操作立即可見)。
  • JMM不保證對64位的long型和double型變量的寫操作具有原子性。

什么是happens-before

JMM提供了「happens-before規則」(JSR-133規范), 開發者可以遵循這種規范編寫程序,可以保證程序在JMM中具有強的內存可見性。JMM使用happens-before的概念來定制兩個操作之間的執行順序。這兩個操作可以在一個線程以內,也可以是不同的線程之間。因此,JMM可以通過happens-before關系向程序員提供跨線程的內存可見性保證。

happens-before關系的定義如下:

  1. 如果一個操作happens-before另一個操作,那么第一個操作的執行結果將對第二個操作可見,而且第一個操作的執行順序排在第二個操作之前。
  2. 「兩個操作之間存在happens-before關系,并不意味著Java平臺的具體實現必須要按照happens-before關系指定的順序來執行。如果重排序之后的執行結果,與按happens-before關系來執行的結果一致,那么JMM也允許這樣的重排序。」

總之,「如果操作A happens-before操作B,那么操作A在內存上所做的操作對操作B都是可見的,不管它們在不在一個線程。」

在Java中,有以下天然的happens-before關系:

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

結束語

本節內容可能不像之前那么好理解,比較抽象,所以本文也有不足的地方,大家自己可以多查查一些資料,綜合理解。下一節,帶大家深入學習一下Java的volatile。

責任編輯:姜華 來源: 今日頭條
相關推薦

2020-05-28 07:50:18

重排序happens-befCPU

2022-07-26 08:40:42

Java并發工具類

2022-08-02 06:31:32

Java并發工具類

2022-07-11 10:47:46

容器JAVA

2022-06-10 13:56:42

Java

2022-06-30 08:14:05

Java阻塞隊列

2022-06-27 08:01:45

Java內存模型

2022-06-24 06:43:57

線程池線程復用

2022-06-15 15:14:17

Java公平鎖非公平鎖

2022-06-09 11:20:44

volatile關鍵字

2022-06-30 14:31:57

Java阻塞隊列

2024-09-09 08:30:56

代碼

2021-05-09 18:32:05

JMMHappens-befJava

2022-07-18 14:18:26

Babel代碼面試

2021-09-07 10:44:33

Java 注解開發

2021-04-12 21:34:29

Redis故障數據

2024-02-22 15:36:23

Java內存模型線程

2021-12-08 06:53:29

面試動態代理

2022-09-29 07:30:57

數據庫索引字段

2022-08-17 07:53:10

Volatile關鍵字原子性
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 羞羞视频免费观看入口 | 就操在线 | 女生羞羞视频 | 欧美中文字幕一区二区三区亚洲 | 一区二区三区四区不卡 | www.天天操.com | 国产欧美日韩精品在线观看 | 久久综合伊人 | 亚洲色图在线观看 | 欧美色a v| 亚洲精品免费在线观看 | 久久久一区二区三区四区 | 日韩在线小视频 | 日韩午夜网站 | 日韩在线观看中文字幕 | 国产精品久久福利 | 国产欧美一区二区三区国产幕精品 | 色综合久久88色综合天天 | 黄网站在线播放 | 成人精品网 | 欧美一区二区三区精品免费 | 久久精品黄色 | 成人精品一区二区三区中文字幕 | 黄视频网址 | 精品一区在线 | 亚洲另类视频 | 国产精品精品久久久 | 99精品在线免费观看 | 久久久精品网 | 国产精品一区二区不卡 | 午夜影院视频在线观看 | 免费看片在线播放 | 亚洲精品久久久9婷婷中文字幕 | 99久久精品国产一区二区三区 | h漫在线观看 | 一区二区三区不卡视频 | 亚洲成人中文字幕 | 精品毛片 | 欧美日本在线观看 | 国产99久久久国产精品 | 国产日韩欧美一区二区 |