Java锁类型,当另一个线程正在执行时取消执行

Java锁类型,当另一个线程正在执行时取消执行,java,android,multithreading,concurrency,Java,Android,Multithreading,Concurrency,我所知道的java并发的唯一工具是synchronized,也就是说,如果两个线程调用同一个方法,那么一个线程将在执行之前等待另一个线程完成 然而,对于我的用例,如果另一个线程正在执行代码,我希望第二个线程放弃调用。比如: boolean isInUse = false; public void doWorkIfNotBusy() { if (isInUse) { return; } else { isInUse = true; // do work i

我所知道的java并发的唯一工具是synchronized,也就是说,如果两个线程调用同一个方法,那么一个线程将在执行之前等待另一个线程完成

然而,对于我的用例,如果另一个线程正在执行代码,我希望第二个线程放弃调用。比如:

boolean isInUse = false;

public void doWorkIfNotBusy() {
  if (isInUse) {
    return;
  } else {
    isInUse = true;
    // do work
    isInUse = false;
  }
}

代码有错误。必须有一种简单但正确的方法来实现这一点。

您的代码不正确,因为非易失性变量是从多个线程访问的,而无需任何额外的同步(有关Java内存模型的详细信息,请参阅)。您可以使用
Lock
及其
tryLock
方法来实现所需的行为:

Lock lock = new ReentrantLock();

public void doWorkIfNotBusy() {
    if (lock.tryLock()) {
        try {
            // do work
         } finally {
             lock.unlock();
         }
     } 
}
如果成功获取锁,它将执行该操作,然后释放锁。否则,它会立即返回。您可以在此处阅读更多信息: