我知道java并发的唯一工具是synchronized,即如果2个线程调用相同的方法,则会在执行之前等待另一个完成。
但是,对于我的用例,如果另一个线程正在执行代码,我希望第二个线程放弃调用。类似的东西:
boolean isInUse = false;
public void doWorkIfNotBusy() {
if (isInUse) {
return;
} else {
isInUse = true;
// do work
isInUse = false;
}
}
代码有bug。必须有一种简单而正确的方法来做到这一点。
答案 0 :(得分:1)
您的代码不正确,因为从多个线程访问非易失性变量而没有任何其他同步(有关Java内存模型的详细信息,请参阅https://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4)。您可以使用Lock
及其tryLock
方法来实现所需的行为:
Lock lock = new ReentrantLock();
public void doWorkIfNotBusy() {
if (lock.tryLock()) {
try {
// do work
} finally {
lock.unlock();
}
}
}
如果成功获取锁定,它将完成工作,然后释放锁定。否则,它立即返回。您可以在此处详细了解:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html。