国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

線程沖突 - Thread interference

lncwwn / 2876人閱讀

摘要:解決這兩種問題的方法是線程同步。在介紹線程同步之前,先來了解一下這兩個問題。這篇文章先介紹第一個問題線程沖突。這是一種可能的結(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

相關(guān)文章

  • 內(nèi)存一致性錯誤 - Memory Consistency Errors

    摘要:解決這兩種問題的方法是線程同步。在介紹線程同步之前,先來了解一下這兩個問題。這篇文章介紹第二個問題內(nèi)存一致性錯誤。 線程通信,主要通過共享訪問進程資源。這種通信方式非常高效,但存在兩個問題:線程沖突(thread interference) , 內(nèi)存一致性錯誤(memory consistensy errors)。 解決這兩種問題的方法是 線程同步(thread synchroniza...

    baiy 評論0 收藏0
  • (六) synchronized的源碼分析

    摘要:關(guān)鍵字經(jīng)過編譯之后,會在同步塊的前后分別形成和這兩個字節(jié)碼指令。當我們的把字節(jié)碼加載到內(nèi)存的時候,會對這兩個指令進行解析。這兩個字節(jié)碼都需要一個類型的參數(shù)來指明要鎖定和解鎖的對象。最后喚醒暫停的線程。 文章簡介 前面我有文章介紹了synchronized的基本原理,這篇文章我會從jvm源碼分析synchronized的實現(xiàn)邏輯,希望讓大家有一個更加深度的認識 內(nèi)容導航 從synchr...

    jhhfft 評論0 收藏0
  • AbstractQueuedSynchronizer理解之一(ReentrantLock)

    摘要:有了這個基礎(chǔ),才能發(fā)揮作用,使得在節(jié)點取消和異常時能夠保證隊列在多線程下的完整性。 Doug Lea是JDK中concurrent工具包的作者,這位大神是誰可以自行g(shù)oogle。 本文淺析ReentrantLock(可重入鎖)的原理 Lock接口 showImg(https://segmentfault.com/img/bV2671?w=276&h=176); Lock接口定義了這幾個...

    learning 評論0 收藏0
  • AbstractQueuedSynchronizer理解之一(ReentrantLock)

    摘要:有了這個基礎(chǔ),才能發(fā)揮作用,使得在節(jié)點取消和異常時能夠保證隊列在多線程下的完整性。 Doug Lea是JDK中concurrent工具包的作者,這位大神是誰可以自行g(shù)oogle。 本文淺析ReentrantLock(可重入鎖)的原理 Lock接口 showImg(https://segmentfault.com/img/bV2671?w=276&h=176); Lock接口定義了這幾個...

    bigdevil_s 評論0 收藏0
  • AbstractQueuedSynchronizer理解之一(ReentrantLock)

    摘要:有了這個基礎(chǔ),才能發(fā)揮作用,使得在節(jié)點取消和異常時能夠保證隊列在多線程下的完整性。 Doug Lea是JDK中concurrent工具包的作者,這位大神是誰可以自行g(shù)oogle。 本文淺析ReentrantLock(可重入鎖)的原理 Lock接口 showImg(https://segmentfault.com/img/bV2671?w=276&h=176); Lock接口定義了這幾個...

    yunhao 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<