簡體   English   中英

與易失性“狀態標志”布爾值同步?

[英]Synchronization with volatile 'status flag' boolean?

我已經閱讀了有關volatile用法的“狀態標志”模式。 它說,如果狀態標志不依賴於任何其他狀態,那么我可以使用volatile而不進行任何同步。 它將保證其他線程的標志可見性。 而且,寫入布爾值是原子的。

但是在另一個相關問題中,據說只有當一個線程可以修改該標志時,才可以使用volotile 否則,我需要使用任何同步或AtomicBoolean

在我的例子,我有stopped標志,但它可以修改不是從一個線程中更多:方法stop()continue() doSmth()不會更新任何狀態。 如果假設在continue()方法之后立即調用stop()時不做任何工作是可以的,那么代碼是線程安全的嗎?

class MyClass {
    private volatile boolean stopped;

    public void doWork() {
        while(!stopped) {
            doSmth();
        }
    }

    public void stop() {
        stopped = true;
    }

    public void continue() {
        stopped = false;
    }
}

對於我來說,應該。 你能澄清一下我是否錯了嗎?

volatile僅確保對變量的更改可用於所有線程。

背景:線程可以在本地創建共享變量的副本。 將這些局部變量的值與全局共享變量同步是一種volatile影響。

但是,這在單個條目,監視器/關鍵區域的情況下不會同步

整個java.util.concurrent提供了諸如確保僅一個線程可以更改值之類的功能。 如果您想從頭開始,則可以使用兩個變量來做一些阻礙性的事情:搜索Dijkstra算法

在這里,我認為AtomicBoolean對於非阻塞用法可能很好。


如果要實現具有全局布爾狀態,該狀態將暫停 resp。 觸發(當你恢復線程stopped ),而不是一些丑陋的忙等待

public void run () {
    while (true) {
        doWork(); 
        try {
            barrier.await();
        } catch (InterruptedException | BrokenBarrierException ex) {
            return;
        }
    }
}

使用全局CyclicBarrier不是最好的API,因為它可以與N個預定義的Runnable

暫無
暫無

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

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