簡體   English   中英

全局變量僅會瞬時更改,這是因為同時進行讀/寫嗎?

[英]Global variable changes only momentarily, is this because of simultaneous read/write?

我有一個全局變量和多個線程,它們每隔幾秒鍾會不斷讀取該變量。

現在,我在一個線程中有了一個寫入變量的方法,當我在要寫入該函數的函數中打印出全局變量時,我看到寫入已發生,並且變量值已按需更改。

但是,當我在函數執行后立即從函數范圍之外進行讀取時,實際上全局變量沒有更改,並且寫入未成功。

聽起來像是由於同時讀取/寫入? being changed at least momentarily. 我在想有些事情我不理解,盡管直覺上我看不到多線程將如何改變任何事情,因為全局變量至少暫時改變的。

除了提到的以外,沒有其他寫操作發生。

我還沒有對多線程進行過多的閱讀,所以我只想高層次的“是的,這是可行的,並且對多線程和全局變量有意義”,我將在必要時進行閱讀。

在沒有看到實際代碼的情況下,我聞到了問題,只需在全局靜態變量前面使用volatile並查看魔術。 問題解決了。

有關更多信息,請參見揮發性與靜態

您確定沒有兩個具有相同名稱的變量嗎?

我在要寫入的函數中打印出全局變量,我看到寫入已經發生了……但是當我從范圍之外進行讀取時……實際上,全局變量沒有改變。

如果您的函數聲明的局部變量的名稱遮蓋了全局變量,那就是我所期望的。

您應該將變量聲明為volatile並同步對其的訪問。 以下代碼是防止訪問myVariable的線程之間發生沖突的示例。

public class ChangeVariable {
    static volatile int myVariable;
    static final Object lock = new Object();

    public static void setVariable(int value) {
        synchronized (lock) {
            myVariable = value;
        }
    }

    public static int getVariable() {
        synchronized (lock) {
            return myVariable;
        }
    }
}

暫無
暫無

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

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