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