簡體   English   中英

Java:在沒有 volatile 變量的情況下關閉?

[英]Java: Shutdown without a volatile variable?

以下場景:

我有一個應用程序,它運行了數周,然后我想優雅地關閉它。

以下代碼可以解決問題:

Main-Thread:

boolean volatile active=true;

while(active)
{
    //loop-code (very fast)
}


//shutdown-thread, called once after a few weeks

active=false;

所以現在每次循環迭代后,我都會在主內存中查找,這是易失性讀取的原因(對吧?!)。

我不想要那個,只是為了幾周后的關機。

有沒有其他解決方案,我的主線程會收到有關關閉的通知?

任何直接進入主線程緩存的信號? 這樣它就不必每次都在主內存中查找自己,而是從外部得到通知?

還是有其他解決辦法?

編輯(將我自己的答案整合到這個問題中):

一個可能的解決方案是,減少易失性訪問,請參閱以下代碼:

boolean volatile active=true;


while(active)
{
    for(int i=0; i<100; ++i)
    {
        //loop-code
    }
}

因此,使用該解決方案,我可以減少易失性讀取,但在關閉后,我將最大循環迭代次數從 1 增加到 100。

該解決方案減少了易失性訪問,但並沒有完全消除它。

您認為易失性讀取始終命中主內存的假設不適用於緩存一致性系統。 易失性讀取應該命中 L1,直到另一個線程修改標志並使變量所在的緩存行無效。

但是,易失性讀取與后續訪問建立了先發生關系,因此這可以防止編譯器和 CPU 執行某些延遲隱藏技巧。 相反,使用不透明訪問模式來減輕影響(感謝 Holger :))。

像這樣的事情應該很快,但我會將基准測試留給您:

AtomicBoolean active = new AtomicBoolean(true);

while(active.getOpaque())
{
    //loop-code (very fast)
}


//shutdown-thread, called once after a few weeks

active.setOpaque(false);

如果您想知道所有這些訪問模式是什么,這里有一個很好的總結:使用 JDK 9 內存順序模式

暫無
暫無

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

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