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