大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

Java多線程編程概述
Java多線程的安全問題
Java多線程同步
Java多線程間的通信
Java線程Lock
Java多線程管理
保障線程安全的設計技術
Java鎖的優化及注意事項
Java多線程集合
【Java多線程】單例模式與多線程

Java多線程有序性

有序性(Ordering)是指在什么情況下一個處理器上運行的一個線程所執行的 內存訪問操作在另外一個處理器運行的其他線程看來是亂序的(Out of Order)。

亂序是指內存訪問操作的順序看起來發生了變化。

重排序

在多核處理器的環境下,編寫的順序結構,這種操作執行的順序可能是沒有保障的:

編譯器可能會改變兩個操作的先后順序;

處理器也可能不會按照目標代碼的順序執行;

這種一個處理器上執行的多個操作,在其他處理器來看它的順序與目標代碼指定的順序可能不一樣,這種現象稱為重排序。

重排序是對內存訪問有序操作的一種優化,可以在不影響單線程程序正確的情況下提升程序的性能.但是,可能 對多線程程序的正確性產生影響,即可能導致線程安全問題。

重排序與可見性問題類似,不是必然出現的。

與內存操作順序有關的幾個概念:

源代碼順序, 就是源碼中指定的內存訪問順序。

程序順序, 處理器上運行的目標代碼所指定的內存訪問順序。

執行順序,內存訪問操作在處理器上的實際執行順序。

感知順序,給定處理器所感知到的該處理器及其他處理器的內存訪問操作的順序。

可以把重排序分為指令重排序與存儲子系統重排序兩種:

指令重排序主要是由JIT編譯器,處理器引起的, 指程序順序與執行順序不一樣。

存儲子系統重排序是由高速緩存,寫緩沖器引起的, 感知順序與執行順序 不一致。

指令重排序

在源碼順序與程序順序不一致,或者 程序順序與執行順序不一致的情況下,我們就說發生了指令重排序(Instruction Reorder)。

指令重排是一種動作,確實對指令的順序做了調整, 重排序的對象指令。

javac編譯器一般不會執行指令重排序, 而JIT編譯器可能執行指令重排序。

處理器也可能執行指令重排序, 使得執行順序與程序順序不一致。

指令重排不會對單線程程序的結果正確性產生影響,可能導致多線程程序出現非預期的結果。

存儲子系統重排序

存儲子系統是指寫緩沖器與高速緩存。

高速緩存(Cache)是CPU中為了匹配與主內存處理速度不匹配而設計的一個高速緩存。

寫緩沖器(Store buffer, Write buffer)用來提高寫高速緩存操作的效率。

即使處理器嚴格按照程序順序執行兩個內存訪問操作,在存儲子系統的作用下, 其他處理器對這兩個操作的感知順序與程序順序不一致,即這兩個操作的順序順序看起來像是發生了變化, 這種現象稱為存儲子系統重排序。

存儲子系統重排序并沒有真正的對指令執行順序進行調整,而是造成一種指令執行順序被調整的現象。

存儲子系統重排序對象是內存操作的結果。

從處理器角度來看, 讀內存就是從指定的RAM地址中加載數據到寄存器,稱為Load操作; 寫內存就是把數據存儲到指定的地址表示的RAM存儲單元中,稱為Store操作.內存重排序有以下四種可能:

● LoadLoad重排序,一個處理器先后執行兩個讀操作L1和L2,其他處理器對兩個內存操作的感知順序可能是L2->L1。

● StoreStore重排序,一個處理器先后執行兩個寫操作W1和W2,其他處理器對兩個內存操作的感知順序可能是W2->W1。

● LoadStore重排序,一個處理器先執行讀內存操作L1再執行寫內存操作W1, 其他處理器對兩個內存操作的感知順序可能是W1->L1。

● StoreLoad重排序,一個處理器先執行寫內存操作W1再執行讀內存操作L1, 其他處理器對兩個內存操作的感知順序可能是L1->W1。

內存重排序與具體的處理器微架構有關,不同架構的處理器所允許的內存重排序不同。

內存重排序可能會導致線程安全問題.假設有兩個共享變量int data = 0; boolean ready = false;

處理器1

處理器2

data = 1;       //S1

ready = true;    //S2

 

 

while( !ready){}    //L3

sout( data );      //L4

貌似串行語義

JIT編譯器,處理器,存儲子系統是按照一定的規則對指令,內存操作的結果進行重排序, 給單線程程序造成一種假象----指令是按照源碼的順序執行的.這種假象稱為貌似串行語義. 并不能保證多線程環境程序的正確性。

為了保證貌似串行語義,有數據依賴關系的語句不會被重排序,只有不存在數據依賴關系的語句才會被重排序.如果兩個操作(指令)訪問同一個變量,且其中一個操作(指令)為寫操作,那么這兩個操作之間就存在數據依賴關系(Data dependency)。

如:

x = 1;   y = x + 1; 后一條語句的操作數包含前一條語句的執行結果; 
y = x;   x = 1;		先讀取x變量,再更新x變量的值;
x = 1;  x = 2; 	   兩條語句同時對一個變量進行寫操作

如果不存在數據依賴關系則可能重排序,如:

double  price = 45.8;		
int quantity = 10;
double  sum = price * quantity;

存在控制依賴關系的語句允許重排.一條語句(指令)的執行結果會決定另一條語句(指令)能否被執行,這兩條語句(指令)存在控制依賴關系(Control Dependency). 如在if語句中允許重排,可能存在處理器先執行if代碼塊,再判斷if條件是否成立。

保證內存訪問的順序性

可以使用volatile關鍵字, synchronized關鍵字實現有序性。

全部教程
主站蜘蛛池模板: www国产精品com| 性猛交╳xxx乱大交 性猛交毛片 | 日本一区二区网站 | 综合网久久 | 白云精品视频国产专区 | 欧美一级欧美三级 | 精品视频h| 五月狠狠亚洲小说专区 | 激情五月婷婷久久 | 看黄色免费网站 | 久久99精品久久久久久首页 | 欧美一区二区在线播放 | 日韩区欧美区 | 国产精品a在线观看香蕉 | 68久久久久欧美精品观看 | 91精品国产手机 | 夜夜爽www| 精品一成人岛国片在线观看 | 12至16末成年毛片 | 久久精品国产99久久无毒不卡 | 国产精品欧美亚洲韩国日本99 | 四虎影视紧急入口地址大全 | 91在线公开视频 | 日日噜噜夜夜狠视频免费 | 乱子伦有声小说mp3 仑乱高清在线一级播放 | 国产综合成色在线视频 | 日韩第一页在线 | 亚洲 欧美 中文字幕 | 青青青视频自偷自拍视频1 青青青手机版视频在线观看 | 免费在线视频一区 | 精品一区二区三区 不卡高清 | 久久综合久久自在自线精品自 | 色综合久久综合欧美综合网 | 国产香蕉尹人综合在线 | 久久激情视频 | 精品欧美一区二区三区在线 | 波多野结衣一区二区三区高清在线 | 男女交黄 | 日韩专区中文字幕 | 国产精品久久久久久久久免费hd | 久久香蕉国产线看观看亚洲卡 |