与 volatile 'status flag' 布尔值同步?
Synchronization with volatile 'status flag' boolean?
我已经阅读了有关 volatile
用法的 'status flag' 模式。
它说如果状态标志不依赖于任何其他状态,我可以在没有任何同步的情况下使用 volatile
。它将保证标志对其他线程的可见性。此外,写入布尔值是原子的。
但是在 other 相关问题中说当只有一个线程可以修改标志时使用 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单个条目的句子中,monitor/critical区域。
java.util.concurrent
的整个工具箱提供了确保只有一个线程可以更改值等功能。如果您想从头开始,可以使用 two 变量做一些阻塞的事情:搜索 Dijkstra algorithms.
这里我认为 AtomicBoolean
可能适合 non-blocking 用法。
如果您想实现 暂停 的全局布尔状态。 在切换时恢复 线程(您的stopped
),而不是一些丑陋的忙等待:
public void run () {
while (true) {
doWork();
try {
barrier.await();
} catch (InterruptedException | BrokenBarrierException ex) {
return;
}
}
}
使用全局 CyclicBarrier
- 不是最好的 API 因为它适用于 N 个预定义的 Runnable
s.
我已经阅读了有关 volatile
用法的 'status flag' 模式。
它说如果状态标志不依赖于任何其他状态,我可以在没有任何同步的情况下使用 volatile
。它将保证标志对其他线程的可见性。此外,写入布尔值是原子的。
但是在 other 相关问题中说当只有一个线程可以修改标志时使用 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单个条目的句子中,monitor/critical区域。
java.util.concurrent
的整个工具箱提供了确保只有一个线程可以更改值等功能。如果您想从头开始,可以使用 two 变量做一些阻塞的事情:搜索 Dijkstra algorithms.
这里我认为 AtomicBoolean
可能适合 non-blocking 用法。
如果您想实现 暂停 的全局布尔状态。 在切换时恢复 线程(您的stopped
),而不是一些丑陋的忙等待:
public void run () {
while (true) {
doWork();
try {
barrier.await();
} catch (InterruptedException | BrokenBarrierException ex) {
return;
}
}
}
使用全局 CyclicBarrier
- 不是最好的 API 因为它适用于 N 个预定义的 Runnable
s.