在 AtomicBoolean 上同步?
Synchronizing on AtomicBoolean?
在我正在处理的应用程序中,我发现了以下代码片段:
public class MyClass {
private AtomicBoolean atomicBoolean = new AtomicBoolean(false);
public void Execute() {
// Whole lot of business logic
// ....
synchronized (this.atomicBoolean) {
// Want to make sure that execution is stopped if Stop() was called
if (this.atomicBoolean.get()) {
throw new SpecificException("...");
}
// Some more business logic...
}
}
public void Stop() {
synchronized (this.atomicBoolean) {
this.atomicBoolean.set(true);
}
}
}
根据 FindBugs,这是不正确的,因为我不能将 AtomicBoolean
与 synchronized
一起使用并期望它阻止对象。
我的问题是:重写这些方法的正确方法是什么?我读过有关将锁对象与布尔属性一起使用的信息,但为该锁引入两个新属性似乎有点笨拙。
编辑:如以下评论所述:我认为其意图是在两个 synchronized
块中,AtomicBoolean
无法更改,并且当一个线程位于其中一个中时synchronized
块,none 可以输入其他这样的块。
只需替换这两种方法中的 synchronized (this.atomicBoolean) {
部分,AtomicBoolean::get
和 AtomicBoolean::set
已经是原子的。
...I can't use an AtomicBoolean together with synchronized...
无论价值如何,该语言都允许您在任何 对象上进行同步。
作为风格问题,一些程序员更喜欢只在不用于其他目的的私有对象上进行同步。
private static Object foobarLock = new Object();
...
public void fooItUp(...) {
...
synchronized(foobarLock) {
...
}
...
}
...and expect it to block the object
明确一点,当某个线程 T 进入 synchronized (o) {...}
块时,不会 阻止其他线程访问或修改对象 o
.它唯一阻止的是,它阻止了一些其他线程 U 同时进入同一对象上的同步块 o
。
在我正在处理的应用程序中,我发现了以下代码片段:
public class MyClass {
private AtomicBoolean atomicBoolean = new AtomicBoolean(false);
public void Execute() {
// Whole lot of business logic
// ....
synchronized (this.atomicBoolean) {
// Want to make sure that execution is stopped if Stop() was called
if (this.atomicBoolean.get()) {
throw new SpecificException("...");
}
// Some more business logic...
}
}
public void Stop() {
synchronized (this.atomicBoolean) {
this.atomicBoolean.set(true);
}
}
}
根据 FindBugs,这是不正确的,因为我不能将 AtomicBoolean
与 synchronized
一起使用并期望它阻止对象。
我的问题是:重写这些方法的正确方法是什么?我读过有关将锁对象与布尔属性一起使用的信息,但为该锁引入两个新属性似乎有点笨拙。
编辑:如以下评论所述:我认为其意图是在两个 synchronized
块中,AtomicBoolean
无法更改,并且当一个线程位于其中一个中时synchronized
块,none 可以输入其他这样的块。
只需替换这两种方法中的 synchronized (this.atomicBoolean) {
部分,AtomicBoolean::get
和 AtomicBoolean::set
已经是原子的。
...I can't use an AtomicBoolean together with synchronized...
无论价值如何,该语言都允许您在任何 对象上进行同步。
作为风格问题,一些程序员更喜欢只在不用于其他目的的私有对象上进行同步。
private static Object foobarLock = new Object();
...
public void fooItUp(...) {
...
synchronized(foobarLock) {
...
}
...
}
...and expect it to block the object
明确一点,当某个线程 T 进入 synchronized (o) {...}
块时,不会 阻止其他线程访问或修改对象 o
.它唯一阻止的是,它阻止了一些其他线程 U 同时进入同一对象上的同步块 o
。