我知道的唯一Java并发工具是同步的,即,如果2个线程调用相同的方法,则一个线程将在执行之前等待另一个线程完成。

但是,对于我的用例,如果另一个线程正在执行代码,我希望第二个线程放弃该调用。就像是:

boolean isInUse = false;

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


该代码有错误。必须有一个简单而正确的方法来执行此操作。

最佳答案

您的代码不正确,因为从多个线程访问了一个非易失性变量,而没有任何其他同步(有关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

关于java - Java锁类型,如果另一个线程正在执行,则会取消执行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26830244/

10-11 08:27