在我正在开发的应用程序中,我发现了以下代码片段:
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一起使用,并期望它阻止对象。
我的问题是:重写这个方法的正确方法是什么?我读过关于使用lock对象和布尔属性一起使用的文章,但是为这个锁引入两个新属性似乎有点笨拙。
编辑:正如下面的注释所述:我认为意图是在两个synchronized块中,不能更改AtomicBoolean,并且当一个线程位于synchronized块中时,不能输入任何这样的块。
发布于 2019-04-04 11:11:36
只要从这两种方法中替换synchronized (this.atomicBoolean) {部件,AtomicBoolean::get和AtomicBoolean::set就已经是原子化的了。
发布于 2019-04-04 13:45:47
...I不能用AtomicBoolean和同步.
不管它有什么价值,该语言允许您对任何对象进行同步。
作为一种风格上的问题,一些程序员倾向于只在没有其他用途的私有对象上进行同步。
private static Object foobarLock = new Object();
...
public void fooItUp(...) {
...
synchronized(foobarLock) {
...
}
...
}...and期望它阻止对象
要明确的是,当某些线程T进入synchronized (o) {...}块时,这并不会阻止其他线程访问或修改对象o。它唯一能阻止的是,它阻止其他线程U同时进入同一对象o上的同步块。
https://stackoverflow.com/questions/55514438
复制相似问题