为了账号安全,请及时绑定邮箱和手机立即绑定

同步在原子布尔?

同步在原子布尔?

互换的青春 2022-09-22 10:41:52

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


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


查看完整描述

2 回答

?
德玛西亚99

TA贡献1444条经验 获得超3个赞

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



查看完整回答
反对 回复 2022-09-22
?
HUX布斯

TA贡献1537条经验 获得超6个赞

...我不能将原子布尔值与同步...


无论它的价值如何,该语言都允许您在任何对象上进行同步。


作为一个风格问题,一些程序员更喜欢只同步一个不用于其他目的的私有对象。


private static Object foobarLock = new Object();

...

public void fooItUp(...) {

    ...

    synchronized(foobarLock) {

        ...

    }

    ...

}

...并期望它阻塞对象


需要明确的是,当某个线程 T 进入块时,这不会阻止其他线程访问或修改对象 。它唯一能阻止的是,它阻止其他线程 U 同时在同一对象上输入同步块。synchronized (o) {...}oo


查看完整回答
反对 回复 2022-09-22

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信