gpt4 book ai didi

Java 锁类型,如果另一个线程正在执行则取消执行

转载 作者:行者123 更新时间:2023-12-01 12:18:49 26 4
gpt4 key购买 nike

我所知道的java并发的唯一工具是同步,也就是说,如果2个线程调用同一个方法,一个将等待另一个线程完成后再执行。

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

boolean isInUse = false;

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

代码有错误。必须有一个简单而正确的方法来做到这一点。

最佳答案

您的代码不正确,因为从多个线程访问非 volatile 变量而无需任何额外的同步(有关 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 锁类型,如果另一个线程正在执行则取消执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26830244/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com