Android線程篇(八):原子操作和指令重排

本文部分概念參考大神“海 子”博客品抽,感謝作者:
http://www.cnblogs.com/dolphin0520/p/3920373.html

1.原子性操作

來個(gè)例子:
張三賬戶有1000大洋坡椒,李四賬戶有2000大洋抒倚,張三要給李四轉(zhuǎn)賬100大洋,在這個(gè)過程中:
if成功:
1.張三賬戶:1000-100=900
2.李四賬戶:2000+100=2100
if失敼娣А:
1.張三賬戶:1000
2.李四賬戶:2000
我們把這種要么同時(shí)成功挣跋,要么同時(shí)失敗要么同時(shí)成功的操作叫做具有原子性的操作。

2.指令重排

天天聽大神說:指令重排悬嗓,指令重排到底是個(gè)什么鬼污呼?
舉個(gè)例子:

int i = 0;              
boolean flag = false;
i = 1;                //語句1  
flag = true;          //語句2

上面代碼定義了一個(gè)int型變量,定義了一個(gè)boolean類型變量包竹,然后分別對(duì)兩個(gè)變量進(jìn)行賦值操作燕酷。從代碼順序上看籍凝,語句1是在語句2前面的,那么JVM在真正執(zhí)行這段代碼的時(shí)候會(huì)保證語句1一定會(huì)在語句2前面執(zhí)行嗎苗缩?不一定饵蒂,為什么呢?這里可能會(huì)發(fā)生指令重排序(Instruction Reorder)酱讶。

下面解釋一下什么是指令重排序退盯,一般來說,處理器為了提高程序運(yùn)行效率泻肯,可能會(huì)對(duì)輸入代碼進(jìn)行優(yōu)化得问,它不保證程序中各個(gè)語句的執(zhí)行先后順序同代碼中的順序一致,但是它會(huì)保證程序最終執(zhí)行結(jié)果和代碼順序執(zhí)行的結(jié)果是一致的软免。

比如上面的代碼中宫纬,語句1和語句2誰先執(zhí)行對(duì)最終的程序結(jié)果并沒有影響,那么就有可能在執(zhí)行過程中膏萧,語句2先執(zhí)行而語句1后執(zhí)行漓骚。

但是要注意,雖然處理器會(huì)對(duì)指令進(jìn)行重排序榛泛,但是它會(huì)保證程序最終結(jié)果會(huì)和代碼順序執(zhí)行結(jié)果相同蝌蹂,那么它靠什么保證的呢?再看下面一個(gè)例子:

int a = 10;    //語句1
int r = 2;    //語句2
a = a + 3;    //語句3
r = a*a;     //語句4

這段代碼有4個(gè)語句曹锨,那么可能的一個(gè)執(zhí)行順序是:


image.png

那么可不可能是這個(gè)執(zhí)行順序呢: 語句2 語句1 語句4 語句3

不可能孤个,因?yàn)樘幚砥髟谶M(jìn)行重排序時(shí)是會(huì)考慮指令之間的數(shù)據(jù)依賴性,如果一個(gè)指令I(lǐng)nstruction 2必須用到Instruction 1的結(jié)果沛简,那么處理器會(huì)保證Instruction 1會(huì)在Instruction 2之前執(zhí)行齐鲤。

雖然重排序不會(huì)影響單個(gè)線程內(nèi)程序執(zhí)行的結(jié)果,但是多線程呢椒楣?下面看一個(gè)例子:

//線程1:
context = loadContext();   //語句1
inited = true;             //語句2
 
//線程2:
while(!inited ){
  sleep()
}
doSomethingwithconfig(context);

上面代碼中给郊,由于語句1和語句2沒有數(shù)據(jù)依賴性,因此可能會(huì)被重排序捧灰。假如發(fā)生了重排序淆九,在線程1執(zhí)行過程中先執(zhí)行語句2,而此是線程2會(huì)以為初始化工作已經(jīng)完成毛俏,那么就會(huì)跳出while循環(huán)炭庙,去執(zhí)行doSomethingwithconfig(context)方法,而此時(shí)context并沒有被初始化煌寇,就會(huì)導(dǎo)致程序出錯(cuò)焕蹄。

從上面可以看出,指令重排序不會(huì)影響單個(gè)線程的執(zhí)行唧席,但是會(huì)影響到線程并發(fā)執(zhí)行的正確性擦盾。

為什么要單獨(dú)講解原子性呢嘲驾?原子性在多線程編程中要注意什么問題?如何解決指令重排在多線程下的影響呢迹卢?請(qǐng)關(guān)注下篇文章辽故。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市腐碱,隨后出現(xiàn)的幾起案子誊垢,更是在濱河造成了極大的恐慌,老刑警劉巖症见,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喂走,死亡現(xiàn)場離奇詭異,居然都是意外死亡谋作,警方通過查閱死者的電腦和手機(jī)芋肠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遵蚜,“玉大人帖池,你說我怎么就攤上這事】跃唬” “怎么了睡汹?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長寂殉。 經(jīng)常有香客問我囚巴,道長,這世上最難降的妖魔是什么友扰? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任彤叉,我火速辦了婚禮,結(jié)果婚禮上焕檬,老公的妹妹穿的比我還像新娘姆坚。我一直安慰自己,他們只是感情好实愚,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著兔辅,像睡著了一般腊敲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上维苔,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天碰辅,我揣著相機(jī)與錄音,去河邊找鬼介时。 笑死没宾,一個(gè)胖子當(dāng)著我的面吹牛凌彬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播循衰,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼铲敛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了会钝?” 一聲冷哼從身側(cè)響起伐蒋,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎迁酸,沒想到半個(gè)月后先鱼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奸鬓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年焙畔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片串远。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡闹蒜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抑淫,到底是詐尸還是另有隱情绷落,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布始苇,位于F島的核電站砌烁,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏催式。R本人自食惡果不足惜函喉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望荣月。 院中可真熱鬧管呵,春花似錦、人聲如沸哺窄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽萌业。三九已至坷襟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間生年,已是汗流浹背婴程。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抱婉,地道東北人档叔。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓桌粉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親衙四。 傳聞我的和親對(duì)象是個(gè)殘疾皇子铃肯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容