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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java多线程并行执行命令_深入理解Java多线程与并发框(第④篇)——重排序、屏障指令、as-if-serial规则...

發(fā)布時(shí)間:2025/3/15 java 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java多线程并行执行命令_深入理解Java多线程与并发框(第④篇)——重排序、屏障指令、as-if-serial规则... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

![](http://img.blog.itpub.net/blog/2020/03/24/906435fda570a5e3.png?x-oss-process=style/bb)

# 一、重排序

前篇文章已經(jīng)講了Java內(nèi)存模型和與其三個(gè)特性:原子性、可見性、有序性。但事實(shí)上,為了提升程序的執(zhí)行性能,編譯器 和 處理器 常常會(huì)對(duì)程序指令序列進(jìn)行 重排序。

重排序分為以下幾種:

- 編譯器優(yōu)化重排序

- 處理器重排序

- 指令級(jí)并行重排序

- 內(nèi)存系統(tǒng)重排序

# 二、屏障指令

fence

內(nèi)存屏障(Memory Barrier,或稱為內(nèi)存柵欄,Memory Fence)是一種CPU指令,用于控制特定條件下的重排序和內(nèi)存可見性問題。Java編譯器也會(huì)根據(jù)內(nèi)存屏障的規(guī)則在一定程度地禁止重排序。

# 三、as-if-serial 語句

>重排序也不能毫無規(guī)則,否則語義就變得不可讀, as-if-serial語句 給重排序戴上緊箍咒,起到約束作用。

**as-if-serial語句**規(guī)定重排序要滿足以下兩個(gè)規(guī)則:

- 在單線程環(huán)境下不能改變程序執(zhí)行的結(jié)果;

- 存在數(shù)據(jù)依賴關(guān)系代碼(指令)片段的不允許重排序。

比如下面的代碼:

```

int a = 1;

// ①

int b = 2;

// ②

int c = a + b;

// 依賴于 ① 和 ②

return c;

```

可能會(huì)被優(yōu)化成:

```

int b = 2;

// ②

int a = 1;

// ①

int c = a + b;

// 依賴于 ① 和 ②

return c;

```

上述的重排序既沒有改變單線程下程序運(yùn)行的結(jié)果,又沒有對(duì)存在依賴關(guān)系的指令進(jìn)行重排序。

# 四、happens-before 規(guī)則

產(chǎn)生的背景是為了確保多線程操作下具有內(nèi)存可見性。

如果一個(gè)操作執(zhí)行的結(jié)果需要對(duì)另一個(gè)操作可見,那么這兩個(gè)操作之間必須要存在happens-before關(guān)系。換句話說,操作1 happens-before 操作2,那么操作1的結(jié)果是對(duì)操作2可見的。

這里提到的兩個(gè)操作既可以是在一個(gè)線程之內(nèi),也可以是在不同線程之間。

**規(guī)則**:

1. 程序順序規(guī)則:一個(gè)線程中的每個(gè)操作,happens-before 于該線程中的任意后續(xù)操作

2. 監(jiān)視器鎖規(guī)則:對(duì)一個(gè)鎖的解鎖,happens-before 于隨后對(duì)這個(gè)鎖的加鎖

3. volatile變量規(guī)則:對(duì)一個(gè)volatile域的寫,happens-before 于任意后續(xù)對(duì)這個(gè)volatile域的讀

4. 傳遞性:如果A happens-before B,且B happens-before C,那么A happens-before C

5. start規(guī)則:如果線程A執(zhí)行操作ThreadB.start()(啟動(dòng)線程B),那么A線程的ThreadB.start()操作happens-before于線程B中的任意操作

6. join規(guī)則:如果線程A執(zhí)行操作ThreadB.join()并成功返回,那么線程B中的任意操作happens-before于線程A從ThreadB.join()操作成功返回。

# 總結(jié):

as-if-serial 語句保證單線程環(huán)境下不能改變程序執(zhí)行的結(jié)果,happens-before 規(guī)則保證多線程環(huán)境下不能改變程序執(zhí)行的結(jié)果。

來自 “ ITPUB博客 ” ,鏈接:http://blog.itpub.net/69964492/viewspace-2682230/,如需轉(zhuǎn)載,請(qǐng)注明出處,否則將追究法律責(zé)任。

總結(jié)

以上是生活随笔為你收集整理的java多线程并行执行命令_深入理解Java多线程与并发框(第④篇)——重排序、屏障指令、as-if-serial规则...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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