[英]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
,并且当一个Thread位于其中一个synchronized
块中时,可以输入其他任何块。
只需要替换两个方法中的synchronized (this.atomicBoolean) {
part, AtomicBoolean::get
和AtomicBoolean::set
已经是原子的。
...我不能使用AtomicBoolean和synchronized ...
无论它值多少,该语言都允许您在任何对象上进行同步。
作为一种风格问题,一些程序员更喜欢仅在用于其他目的的私有对象上进行同步。
private static Object foobarLock = new Object();
...
public void fooItUp(...) {
...
synchronized(foobarLock) {
...
}
...
}
...并期望它阻止对象
仅仅是明确的,当一些线T进入synchronized (o) {...}
块,这并不阻止其它线程存取或修改对象o
。 它唯一阻止的是,它阻止某些其他线程U同时进入同一对象o
上的同步块。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.