簡體   English   中英

內存不一致或線程干擾或兩者兼而有之?

[英]Memory inconsistency or thread interference or both?

我在閱讀有關線程時從Internet獲取此代碼。 它說這是內存一致性錯誤的一個例子。 是產生意外輸出的內存不一致還是線程干擾? 為什么它會產生更多正面價值? 它很少輸出負值。

class MemoryConsistencyError extends Thread {
    static int count = 0;
    public void run() {
        for (int x = 0; x < 1000000; x++) {
            count++;
            count--;
        }
        System.out.println(this.getName() + " count: " + count);
    }
    public static void main(String[] args) throws InterruptedException {
        MemoryConsistencyError t1 = new MemoryConsistencyError();
        MemoryConsistencyError t2 = new MemoryConsistencyError();
        t1.start();
        t2.start();
    }
}

JLS第17章:

線程中的每個動作都發生在該線程中的每個動作之前,該動作在程序的順序中稍后出現。

還有其他情況發生在之前,但沒有適用於您發布的代碼(沒有synchronizestartjoin線程或代碼中的volatile )。 這里的重點是發生在報價之前適用於一個線程。 所以,不是你的情況,你有兩個線程。

不是一個破壞的發生前保證 (這表明內存不一致), 只是線程干擾

線程干擾是由於每個 - 或++操作實際上意味着三個操作:讀取,輸入或減少和存儲。 這是兩個線程的操作重疊的地方。

為什么它會產生更多正面價值? 它很少輸出負值。

因為行順序可以更容易覆蓋使用遞減發生的存儲而不是具有遞增的存儲。 線程干擾使您可以讀取陳舊數據。

  1. count是:讀取,增加,存儲( count++
  2. count是:讀取,減少,存儲( count--

每個STORE都使用READ的值。 因此,讀取0的t1增加並存儲1.與t2相同。 然而,t2增加有很大的機會在減少后覆蓋t1商店。 反過來說不是這樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM