在我正在处理的应用程序中,我发现了以下代码片段: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贡献1770条经验 获得超3个赞
只需从两种方法中替换部分,并且已经是原子的。synchronized (this.atomicBoolean) {
AtomicBoolean::get
AtomicBoolean::set
HUX布斯
TA贡献1876条经验 获得超6个赞
...我不能将原子布尔值与同步...
无论它的价值如何,该语言都允许您在任何对象上进行同步。
作为一个风格问题,一些程序员更喜欢只同步一个不用于其他目的的私有对象。
private static Object foobarLock = new Object();
...
public void fooItUp(...) {
...
synchronized(foobarLock) {
...
}
...
}
...并期望它阻塞对象
需要明确的是,当某个线程 T 进入块时,这不会阻止其他线程访问或修改对象 。它唯一能阻止的是,它阻止其他线程 U 同时在同一对象上输入同步块。synchronized (o) {...}oo
添加回答
举报
0/150
提交
取消