在我正在开发的应用程序中,我找到了以下代码片段:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
根据FindBugs,这是不正确的,因为我不能与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);
}
}
}
一起使用AtomicBoolean
并期望它阻塞对象。
我的问题是:重写此方法的正确方法是什么?我已经读过有关将锁对象与boolean属性一起使用的信息,但为该锁引入两个新属性似乎有点笨拙。
编辑:如以下评论中所述:我认为目的是在两个synchronized
块中,synchronized
无法更改,并且当一个线程位于{ {1}}个块,则不能输入其他任何这样的块。
答案 0 :(得分:8)
只需替换两种方法中的synchronized (this.atomicBoolean) {
部分,AtomicBoolean::get
和AtomicBoolean::set
已经是原子的。
答案 1 :(得分:1)
...我不能与AtomicBoolean一起使用...
无论价值多少,该语言都可以让您在任何对象上进行同步。
从风格上讲,某些程序员更喜欢仅在没有其他用途的私有对象上进行同步。
private static Object foobarLock = new Object();
...
public void fooItUp(...) {
...
synchronized(foobarLock) {
...
}
...
}
...并期望它会阻塞对象
请注意,当某个线程T进入synchronized (o) {...}
块时,不是阻止其他线程访问或修改对象o
。唯一阻止的是,它防止其他线程U同时在同一对象o
上输入同步块。