簡體   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