首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同步在AtomicBoolean上?

同步在AtomicBoolean上?
EN

Stack Overflow用户
提问于 2019-04-04 11:08:42
回答 2查看 903关注 0票数 3

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

代码语言:javascript
复制
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一起使用,并期望它阻止对象。

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

编辑:正如下面的注释所述:我认为意图是在两个synchronized块中,不能更改AtomicBoolean,并且当一个线程位于synchronized块中时,不能输入任何这样的块。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-04 11:11:36

只要从这两种方法中替换synchronized (this.atomicBoolean) {部件,AtomicBoolean::getAtomicBoolean::set就已经是原子化的了。

票数 8
EN

Stack Overflow用户

发布于 2019-04-04 13:45:47

...I不能用AtomicBoolean和同步.

不管它有什么价值,该语言允许您对任何对象进行同步。

作为一种风格上的问题,一些程序员倾向于只在没有其他用途的私有对象上进行同步。

代码语言:javascript
复制
private static Object foobarLock = new Object();
...
public void fooItUp(...) {
    ...
    synchronized(foobarLock) {
        ...
    }
    ...
}

...and期望它阻止对象

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55514438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档