在AtomicBoolean上同步?

时间:2019-04-04 11:08:42

标签: java multithreading java-8 synchronized atomicboolean

在我正在开发的应用程序中,我找到了以下代码片段:

[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}}个块,则不能输入其他任何这样的块。

2 个答案:

答案 0 :(得分:8)

只需替换两种方法中的synchronized (this.atomicBoolean) {部分,AtomicBoolean::getAtomicBoolean::set已经是原子的。

答案 1 :(得分:1)

  

...我不能与AtomicBoolean一起使用...

无论价值多少,该语言都可以让您在任何对象上进行同步。

从风格上讲,某些程序员更喜欢仅在没有其他用途的私有对象上进行同步。

private static Object foobarLock = new Object();
...
public void fooItUp(...) {
    ...
    synchronized(foobarLock) {
        ...
    }
    ...
}
  

...并期望它会阻塞对象

请注意,当某个线程T进入synchronized (o) {...}块时,不是阻止其他线程访问或修改对象o。唯一阻止的是,它防止其他线程U同时在同一对象o上输入同步块。