[英]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,這是不正確的,因為我不能將AtomicBoolean
與synchronized
一起使用並期望它阻止對象。
我的問題是:重寫這種方法的正確方法是什么? 我已經閱讀過使用一個鎖對象和一個布爾屬性,但是為這個鎖引入兩個新屬性似乎有點笨拙。
編輯:如下面的評論中所述:我認為目的是在兩個synchronized
塊中,不能更改AtomicBoolean
,並且當一個Thread位於其中一個synchronized
塊中時,可以輸入其他任何塊。
只需要替換兩個方法中的synchronized (this.atomicBoolean) {
part, AtomicBoolean::get
和AtomicBoolean::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.