同步在原子布尔?

在我正在处理的应用程序中,我发现了以下代码片段:


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


我的问题是:重写此方法的正确方法是什么?我已经阅读了有关将锁对象与布尔属性一起使用的信息,但是为此锁引入两个新属性似乎有点笨拙。


编辑:如下面的评论中所述:我认为其意图是在两个块中,不能更改,并且当一个线程在其中一个块中时,不能输入其他此类块。synchronizedAtomicBooleansynchronized


互换的青春
浏览 69回答 2
2回答

德玛西亚99

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

HUX布斯

...我不能将原子布尔值与同步...无论它的价值如何,该语言都允许您在任何对象上进行同步。作为一个风格问题,一些程序员更喜欢只同步一个不用于其他目的的私有对象。private static Object foobarLock = new Object();...public void fooItUp(...) {    ...    synchronized(foobarLock) {        ...    }    ...}...并期望它阻塞对象需要明确的是,当某个线程 T 进入块时,这不会阻止其他线程访问或修改对象 。它唯一能阻止的是,它阻止其他线程 U 同时在同一对象上输入同步块。synchronized (o) {...}oo
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java