繁体   English   中英

在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,这是不正确的,因为我不能将AtomicBooleansynchronized一起使用并期望它阻止对象。

我的问题是:重写这种方法的正确方法是什么? 我已经阅读过使用一个锁对象和一个布尔属性,但是为这个锁引入两个新属性似乎有点笨拙。

编辑:如下面的评论中所述:我认为目的是在两个synchronized块中,不能更改AtomicBoolean ,并且当一个Thread位于其中一个synchronized块中时,可以输入其他任何块。

只需要替换两个方法中的synchronized (this.atomicBoolean) { part, AtomicBoolean::getAtomicBoolean::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM