摘要:解決這兩種問題的方法是線程同步。在介紹線程同步之前,先來了解一下這兩個問題。這篇文章先介紹第一個問題線程沖突。這是一種可能的結(jié)果,也可能線程的結(jié)果被覆蓋或沒有交疊,不發(fā)生錯誤線程沖突的結(jié)果不可預料,很難被發(fā)現(xiàn)并且修復
線程通信,主要通過共享訪問進程資源。這種通信方式非常高效,但存在兩個問題:線程沖突(thread interference) , 內(nèi)存一致性錯誤(memory consistensy errors)。
解決這兩種問題的方法是 線程同步(thread synchronization)。在介紹線程同步之前,先來了解一下這兩個問題。
這篇文章先介紹第一個問題:線程沖突。
線程沖突當兩個運行在不同線程的操作,作用在同一個數(shù)據(jù)上,會發(fā)生線程沖突 (Thread interference)
這也意味著,兩個操作分別由多個步驟組成,且兩個操作同時執(zhí)行,會導致步驟交疊
一個例子這里有一個類 Counter
class Counter { private int c = 0; public void increment() { c++; } public void decrement() { c--; } public int value() { return c; } }
看起來,Counter中的操作不會產(chǎn)生交疊。比如increment()方法中,唯一的 statement 是c++。
然而,即使是一個簡單的 statement,在JVM中也會轉(zhuǎn)換為多個步驟 —— 即該 statement 非原子操作
一個簡單的 statement c++,可以簡單分為三步 ( c--同理 )
取出當前c的值
將取出的值增加1
將取出的值存儲至c(覆蓋原值)
假設(shè),線程A調(diào)用increment()的同時,線程B調(diào)用decrement()。則兩個操作可能產(chǎn)生如下交疊
Thread A: 取出 c.
Thread B: 取出 c.
Thread A: 將取出的值增加 1.
Thread B: 將取出的值減少 -1.
Thread A: 將取出的值存儲至 c; c == 1.
Thread B: 將取出的值存儲至 c; c == -1.
線程A的結(jié)果丟失,被線程B的結(jié)果覆蓋。這是一種可能的結(jié)果,也可能線程B的結(jié)果被A覆蓋;或沒有交疊,
不發(fā)生錯誤 —— 線程沖突 的結(jié)果不可預料,bug很難被發(fā)現(xiàn)并且修復
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/65224.html
摘要:解決這兩種問題的方法是線程同步。在介紹線程同步之前,先來了解一下這兩個問題。這篇文章介紹第二個問題內(nèi)存一致性錯誤。 線程通信,主要通過共享訪問進程資源。這種通信方式非常高效,但存在兩個問題:線程沖突(thread interference) , 內(nèi)存一致性錯誤(memory consistensy errors)。 解決這兩種問題的方法是 線程同步(thread synchroniza...
摘要:關(guān)鍵字經(jīng)過編譯之后,會在同步塊的前后分別形成和這兩個字節(jié)碼指令。當我們的把字節(jié)碼加載到內(nèi)存的時候,會對這兩個指令進行解析。這兩個字節(jié)碼都需要一個類型的參數(shù)來指明要鎖定和解鎖的對象。最后喚醒暫停的線程。 文章簡介 前面我有文章介紹了synchronized的基本原理,這篇文章我會從jvm源碼分析synchronized的實現(xiàn)邏輯,希望讓大家有一個更加深度的認識 內(nèi)容導航 從synchr...
摘要:有了這個基礎(chǔ),才能發(fā)揮作用,使得在節(jié)點取消和異常時能夠保證隊列在多線程下的完整性。 Doug Lea是JDK中concurrent工具包的作者,這位大神是誰可以自行g(shù)oogle。 本文淺析ReentrantLock(可重入鎖)的原理 Lock接口 showImg(https://segmentfault.com/img/bV2671?w=276&h=176); Lock接口定義了這幾個...
摘要:有了這個基礎(chǔ),才能發(fā)揮作用,使得在節(jié)點取消和異常時能夠保證隊列在多線程下的完整性。 Doug Lea是JDK中concurrent工具包的作者,這位大神是誰可以自行g(shù)oogle。 本文淺析ReentrantLock(可重入鎖)的原理 Lock接口 showImg(https://segmentfault.com/img/bV2671?w=276&h=176); Lock接口定義了這幾個...
摘要:有了這個基礎(chǔ),才能發(fā)揮作用,使得在節(jié)點取消和異常時能夠保證隊列在多線程下的完整性。 Doug Lea是JDK中concurrent工具包的作者,這位大神是誰可以自行g(shù)oogle。 本文淺析ReentrantLock(可重入鎖)的原理 Lock接口 showImg(https://segmentfault.com/img/bV2671?w=276&h=176); Lock接口定義了這幾個...
閱讀 1343·2019-08-30 15:55
閱讀 1645·2019-08-26 10:21
閱讀 3438·2019-08-23 18:28
閱讀 3375·2019-08-23 15:38
閱讀 744·2019-08-23 15:24
閱讀 2135·2019-08-23 13:59
閱讀 775·2019-08-23 11:31
閱讀 2871·2019-08-23 10:53