《七天七并發(fā)》筆記第一天互斥和內(nèi)存模型

《七天七并發(fā)》第一天互斥和內(nèi)存模型

  • 并行并不只是說多核

    • bit level 并行
    • intstruction-level并行静檬。通過流水線炭懊、亂序執(zhí)行并级、猜測(cè)執(zhí)行達(dá)到
    • data-level并行。并行對(duì)大量數(shù)據(jù)施加統(tǒng)一操作凛虽,如GPU
    • task-level死遭。多處理器
  • 并發(fā)問題產(chǎn)生原因:

    • 內(nèi)存可見性問題。
    • 指令亂序執(zhí)行凯旋。編譯器靜態(tài)優(yōu)化呀潭、JVM動(dòng)態(tài)優(yōu)化、硬件亂序來(lái)優(yōu)化性能至非。++i 解釋成多個(gè)指令钠署,加重了亂序的影響。
  • synchronization:執(zhí)行順序上(互斥)荒椭、可見性上的雙重保證谐鼎。即happens before的語(yǔ)義:

    • Each action in a thread happens before every action in that thread that comes later in the program's order.
    • An unlock on a monitor happens before every subsequent lock on that same monitor.
    • A write to a volatile field happens before every subsequent read of that same volatile.
    • A call to start() on a thread happens before any actions in the started thread.
    • All actions in a thread happen before any other thread successfully returns from a join() on that thread.
  • 只涉及一個(gè)變量的互斥場(chǎng)景,使用java.util.concurrent.aotmic包是好選擇趣惠。

  • Thread.join方法使得檢查線程是否已終止狸棍,并將其他線程對(duì)共享內(nèi)存的修改對(duì)當(dāng)前線程可見。

  • 【哲學(xué)家就餐問題】https://zh.wikipedia.org/wiki/%E5%93%B2%E5%AD%A6%E5%AE%B6%E5%B0%B1%E9%A4%90%E9%97%AE%E9%A2%98

    • 【資源分級(jí)解法】將爭(zhēng)用的資源編號(hào)味悄,獲取時(shí)編號(hào)從小到大草戈,釋放時(shí)編號(hào)從大到小。如果已獲取資源3侍瑟,5唐片,要去獲取資源2,那么必須先釋放資源5涨颜,3费韭。原理是:只有持有最大編號(hào)資源的一個(gè)哲學(xué)家可以進(jìn)餐,而他不會(huì)卡死庭瑰,因?yàn)樗阅塬@取最大編號(hào)資源星持,是因?yàn)樗栊【幪?hào)資源已經(jīng)被持有了。這樣就能保證至少有一個(gè)哲學(xué)家可以進(jìn)餐见擦。
    • 【服務(wù)生解法】通過一個(gè)服務(wù)生(master thread)原子性打包分配所需資源钉汗,保證了資源獲取的串行。
    • 【Chandy/Misra解法】將筷子湊成對(duì)(資源打包)鲤屡,餓的人將獲得一個(gè)換筷子券损痰,餓的人將券給有筷子的人,有筷子的人吃完了酒来,將筷子給剛才給券的人卢未。原理是,多個(gè)資源打包,資源獲取辽社、釋放都是原子性的伟墙。
    • 哲學(xué)家思考時(shí)間越一致,比如都不思考滴铅,一直在爭(zhēng)用資源戳葵,越容易死鎖。哲學(xué)家就餐時(shí)間越長(zhǎng)汉匙,越容易死鎖拱烁。
  • 【incorrectly synchronized】即【 data race】:

    • there is a write of a variable by one thread,
    • there is a read of the same variable by another thread and
    • the write and read are not ordered by synchronization
  • 內(nèi)置鎖限制:

    • 進(jìn)入阻塞后無(wú)法中斷
    • 無(wú)法設(shè)置超時(shí)
    • 代碼塊只能在同一個(gè)方法中

java內(nèi)存模型

《The Java Memory Model》http://www.cs.umd.edu/~pugh/java/memoryModel/

界定了這些并發(fā)問題的界限,并給出解決方案噩翠。

final

int old memory model. synchronization was the only way to ensure that all threads see the value of a final field that was written by the constructor.
新的JMM中戏自,只要constructor過程中this不逸出,則能保證final字段被其他線程正確的看到伤锚,如果final字段指向一個(gè)數(shù)組或?qū)ο笊帽剩瑪?shù)組或?qū)ο螅材鼙WC其他線程看到構(gòu)造器結(jié)束那個(gè)點(diǎn)的最新的值屯援,而不是現(xiàn)在最新的值(因?yàn)闃?gòu)造完成后猛们,有可能先被其他線程更新了)。

volatile

Under the old memory model, accesses to volatile variables could not be reordered with each other, but they could be reordered with nonvolatile variable accesses. 這樣會(huì)導(dǎo)致volatile不能作為兩個(gè)線程之間的信號(hào)變量狞洋,因?yàn)榫€程B看到volatile的變量變更后阅懦,不能保證在線程A中排在該volatile變量之前的write能被看到。
于是volatile變量似乎有了鎖的作用:Writing to a volatile field has the same memory effect as a monitor release, and reading from a volatile field has the same memory effect as a monitor acquire.
In effect, because the new memory model places stricter constraints on reordering of volatile field accesses with other field accesses, volatile or not, anything that was visible to thread A when it writes to volatile field f becomes visible to thread B when it reads f.
因此volatile只能保證可見性問題徘铝,沒法保證互斥問題。

volatile很實(shí)用于開關(guān)場(chǎng)景惯吕,比如標(biāo)識(shí)一件事做完了惕它,比如初始化完成了,或者網(wǎng)絡(luò)請(qǐng)求處理完成废登。

"double-checked locking" problem

為了lazy init淹魄,某個(gè)field被使用時(shí)候才init。

class SomeClass {
  private Resource resource = null;
  public Resource getResource() {
    if (resource == null) {
      synchronized {
        if (resource == null) 
          resource = new Resource();
      }
    }
    return resource;
  }
}

因?yàn)榭赡茉赗esource構(gòu)造完成之前堡距,它的引用就被賦給SomeClass的field resource甲锡。所以線程B可能看到被初始化了一般的Resource對(duì)象。
The class loader, which synchronizes on the classes' Class object, executes static initializer blocks at class initialization time. That means that the effect of static initializers is automatically visible to all threads as soon as the class loads.

【解決方案一】:
static filed的初始化已經(jīng)基于這個(gè)class的class obj synchronizes過了羽戒,所以一旦初始化完成能理解被其他thread看到:
The class loader, which synchronizes on the classes' Class object, executes static initializer blocks at class initialization time. That means that the effect of static initializers is automatically visible to all threads as soon as the class loads.
基于這個(gè)缤沦,另外為了保證lazy load,可以這么做:
When the initialized object is a static field of a class with no other methods or fields, the JVM effectively performs lazy initialization automatically.

【解決方案二】:在JSR133標(biāo)準(zhǔn)實(shí)施后(>= jdk1.5)易稠,可以通過將resource申明為violate解決這個(gè)問題缸废。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子企量,更是在濱河造成了極大的恐慌测萎,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,294評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件届巩,死亡現(xiàn)場(chǎng)離奇詭異硅瞧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)恕汇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門腕唧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人拇勃,你說我怎么就攤上這事四苇。” “怎么了方咆?”我有些...
    開封第一講書人閱讀 157,790評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵月腋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我瓣赂,道長(zhǎng)榆骚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,595評(píng)論 1 284
  • 正文 為了忘掉前任煌集,我火速辦了婚禮妓肢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘苫纤。我一直安慰自己碉钠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,718評(píng)論 6 386
  • 文/花漫 我一把揭開白布卷拘。 她就那樣靜靜地躺著喊废,像睡著了一般。 火紅的嫁衣襯著肌膚如雪栗弟。 梳的紋絲不亂的頭發(fā)上污筷,一...
    開封第一講書人閱讀 49,906評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音乍赫,去河邊找鬼瓣蛀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛雷厂,可吹牛的內(nèi)容都是我干的惋增。 我是一名探鬼主播,決...
    沈念sama閱讀 39,053評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼罗侯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼器腋!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,797評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤纫塌,失蹤者是張志新(化名)和其女友劉穎诊县,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體措左,經(jīng)...
    沈念sama閱讀 44,250評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡依痊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,570評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怎披。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胸嘁。...
    茶點(diǎn)故事閱讀 38,711評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖凉逛,靈堂內(nèi)的尸體忽然破棺而出性宏,到底是詐尸還是另有隱情,我是刑警寧澤状飞,帶...
    沈念sama閱讀 34,388評(píng)論 4 332
  • 正文 年R本政府宣布毫胜,位于F島的核電站,受9級(jí)特大地震影響诬辈,放射性物質(zhì)發(fā)生泄漏酵使。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,018評(píng)論 3 316
  • 文/蒙蒙 一焙糟、第九天 我趴在偏房一處隱蔽的房頂上張望口渔。 院中可真熱鬧,春花似錦穿撮、人聲如沸缺脉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)枪向。三九已至,卻和暖如春咧党,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背陨亡。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工傍衡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人负蠕。 一個(gè)月前我還...
    沈念sama閱讀 46,461評(píng)論 2 360
  • 正文 我出身青樓蛙埂,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親遮糖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绣的,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,595評(píng)論 2 350

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

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi閱讀 7,312評(píng)論 0 10
  • **2014真題Directions:Read the following text. Choose the be...
    又是夜半驚坐起閱讀 9,437評(píng)論 0 23
  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,766評(píng)論 0 38
  • 待我歸來(lái),帶你看遍世間璀璨 完美世界
    流夢(mèng)逆羽閱讀 216評(píng)論 0 0
  • 不知道從什么時(shí)候開始,突然覺得自己屡江,活成了滿是虧欠的樣子芭概。除了欠錢,還會(huì)欠更多的東西惩嘉。別人都在朝九晚五罢洲,匆匆趕路,...
    梅九雨閱讀 643評(píng)論 10 5