我正在尝试找到一种干净的方法来编写一个方法,该方法可能会或可能不会基于布尔值包含在synchornized
锁中。然而,我能找到的唯一方法是非常难看。
boolean lock = true;
void remove(Object o) {
if(lock) {
synchornized(this) {
// remove o
}
} else {
// remove o
}
}
但是,我想知道是否有更好的方法可以做到这一点,也许是“同步if”类型的声明?
答案 0 :(得分:1)
您可以使用AtomicBoolean
:
private final AtomicBoolean lock = new AtomicBoolean(false);
...
// compare if it is false and set it to true, no synchronized needed
if (lock.compareAndSet(false, true)) {
statusMessage = "lock acquired";
} else {
statusMessage = "I'm already locked";
}
或将方法定义为synchronized
。
您当前对锁的检查不在同步块中:
if(lock) {
synchronized(this) {
因此,在您将其设置为false之前,2个线程可以通过此检查,真正的信号量为synchronized(this)