[英]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.