并發(fā)機制的底層實現(xiàn)原理

volatile是用來修飾被不同線程訪問和修改的變量表蝙,編譯器不會去假設(shè)這個變量的值粹湃。是輕量級的synchronized保證了共享變量的可見性蕴侧,也就是當(dāng)一個線程修改一個共享變量的時候,另外的線程能夠讀到這個修改的值赁濒,它不會引起線程上下文切換和調(diào)度轨奄。

如果一個字段被申明為volatile,java線程內(nèi)存模型確保所有線程看到這個變量的值是一致的拒炎。

為了提高運行速度處理器不直接與內(nèi)存進(jìn)行通信

“原子”代表最小的單位挪拟,所以原子操作可以看做最小的執(zhí)行單位,該操作在執(zhí)行完畢前不會被任何其他任務(wù)或事件打斷

處理器如何實現(xiàn)原子操作
32位 IA-32處理器基于對緩存加鎖或總線加鎖的方式來實現(xiàn)多處理器之間的原子操作击你。 首先處理器會自動保證基本的內(nèi)存操作的原子性玉组,保證從系統(tǒng)內(nèi)存中讀取或者寫入的一個字節(jié)是原子的,意思是當(dāng)一個處理器讀取一個字節(jié)時丁侄,其他處理器不能訪問這個字節(jié)的內(nèi)存地址惯雳。但是復(fù)雜的內(nèi)存操作處理器是不能自動保證其原子性的,比如跨總線寬度鸿摇、跨多個緩存行的石景、和跨頁表的訪問,但是可以通過 總線鎖定 和 緩存鎖定兩個機制來保存復(fù)雜內(nèi)存操作的原子性

  1. 使用總線鎖定 保證原子性
    比如 多個處理器同時對共享變量進(jìn)行讀改寫操作 多個處理器同時進(jìn)行 讀改寫操作就不是原子的 比如進(jìn)行兩次i++操作 cpu1 執(zhí)行i=i+1 cpu2 也從它的緩存中讀取i進(jìn)行+1操作 然后分別寫入系統(tǒng)內(nèi)存 這個時候 i的值是1 與期望值2 不同拙吉。
    解決這個問題的方法就是 保證CPU1讀改寫共享變量的時候潮孽,cpu2不能操作緩存了該共享變量內(nèi)存地址的緩存。也就是使用總線鎖筷黔,使得cpu1 獨占共享內(nèi)存往史。

  2. 使用緩存鎖保證原子性
    總線鎖 把cpu和內(nèi)存之間的通信鎖住,其他處理器不能操作其他內(nèi)存地址的數(shù)據(jù)佛舱,所以總線鎖的開銷比較大椎例,于是就出現(xiàn)了緩存鎖定。緩存鎖定就是 內(nèi)存區(qū)域如果被緩存在處理器的緩存行中名眉,并且在Lock操作期間被鎖定粟矿,那么當(dāng)它執(zhí)行鎖操作回寫到內(nèi)存的時候,不會鎖住總線损拢,而是修改處理器內(nèi)部的內(nèi)存地址并允許它的緩存一致性來保證操作的原子性陌粹,因為緩存一致性機制會阻止同時修改由兩個以上處理器緩存的內(nèi)存區(qū)域數(shù)據(jù),當(dāng)其他處理器回寫已被鎖定的緩存行數(shù)據(jù)時福压,會使得緩存無效掏秩。

    有兩種情況處理器不會使用緩存鎖定
    1.操作的數(shù)據(jù)不能被緩存在處理其內(nèi)部或舞,或跨多個緩存行,會嗲用總線鎖定

    1. 處理器不支持緩存鎖定蒙幻。

java實現(xiàn)原子操作

  1. 通過鎖和循環(huán)CAS(比較并交換)方式實現(xiàn)原子操作
    JVM的CAS操作正是利用了處理器提供的CMPXCHG指令實現(xiàn)的映凳。

    JDK的并發(fā)包提供了一些類來支持原子操作 如 AtomicBoolean AtomicInteger AtomicLong 。

  2. CAS實現(xiàn)原子操作的三大問題

    1. ABA問題 CAS需要在操作值得時候檢查值有沒有發(fā)生變化 如果 A -> B B -> A 則表面上是沒有變化實際變化了,ABA的解決思路是使用版本號邮破。在變量前追加版本號A B A 就會變成 1A 2B 3A JDK的Atomic包里面提供了一個類 AtomicStampedReference來解決ABA問題诈豌。這個類里面的CAS方法作用是首先檢查當(dāng)前引用是否等于預(yù)期引用和當(dāng)前標(biāo)志是否等于預(yù)期標(biāo)志。
    2. 循環(huán)時間長 開銷大
    3. 只能保證一個共享變量的原子操作抒和,多個共享變量的事后可以用鎖矫渔,或者把多個共享變量合并成一個共享變量來操作 比如 i=2 j=a 合并之后 ij=2a然后進(jìn)行CAS操作

3.使用鎖機制來實現(xiàn)原子操作
  只有獲得鎖的線程才能夠操作鎖定的內(nèi)存區(qū)域,JVM內(nèi)部實現(xiàn)了 偏向鎖摧莽、輕量級鎖庙洼、互斥鎖 除了偏向鎖 其他方式都用了循環(huán)CAS

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市镊辕,隨后出現(xiàn)的幾起案子油够,更是在濱河造成了極大的恐慌,老刑警劉巖征懈,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件石咬,死亡現(xiàn)場離奇詭異,居然都是意外死亡受裹,警方通過查閱死者的電腦和手機碌补,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棉饶,“玉大人厦章,你說我怎么就攤上這事≌赵澹” “怎么了袜啃?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長幸缕。 經(jīng)常有香客問我群发,道長,這世上最難降的妖魔是什么发乔? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任熟妓,我火速辦了婚禮,結(jié)果婚禮上栏尚,老公的妹妹穿的比我還像新娘起愈。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布抬虽。 她就那樣靜靜地躺著官觅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪阐污。 梳的紋絲不亂的頭發(fā)上休涤,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音笛辟,去河邊找鬼功氨。 笑死,一個胖子當(dāng)著我的面吹牛隘膘,可吹牛的內(nèi)容都是我干的疑故。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼弯菊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了踱阿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎廓啊,沒想到半個月后梯浪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡佛点,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年醇滥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片超营。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸳玩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出演闭,到底是詐尸還是另有隱情不跟,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布米碰,位于F島的核電站窝革,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吕座。R本人自食惡果不足惜虐译,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吴趴。 院中可真熱鬧漆诽,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蚪腐,卻和暖如春箭昵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背回季。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工家制, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人泡一。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓颤殴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鼻忠。 傳聞我的和親對象是個殘疾皇子涵但,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

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