gpt4 book ai didi

java - JAVA方法中的线程互斥

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

我需要提供对类的方法的相互访问,以便一个线程一次可以执行该方法内的代码。我已经尝试了下面的解决方案,但我无法理解为什么每次变量“locked”的值都是 false。

public class MyCommand extends BaseCommand {
private static boolean locked=false;

@Override
public boolean execute() throws Exception {
synchronized(MyCommand.class){
while (locked){
wait();
}
locked=true;

//some code with a breakpoint/long blocking operations

locked=false;
notifyAll();
return true;
}
}

我在 while 语句的开头放置了一个断点,并且锁定的变量的值始终为 false,我不明白为什么。第二个断点位于方法体中,我使用它来阻止第一个线程的执行,并查看第二个线程中锁定的变量的值发生变化,但不幸的是它没有发生。因此,最终结果是所有线程都能够执行此方法,而没有任何线程安全性。有人知道如何每次一个线程提供对此方法的独占访问吗?

最佳答案

一次只有一个线程位于同步块(synchronized block)内,对吗?您在 block 的开头停止线程,并检查 locked 的值。好吧,如果您的线程在 block 内,则意味着没有其他线程在 block 内。如果内部没有其他线程,那么 locked 必须为 false,这就是重点。为什么它会让你感到惊讶?

出于上述原因,顺便说一句,您不需要 while(locked) wait() 循环(或整个 locked 事物) - 整个“锁定”是通过在代码周围设置同步锁来实现的。

关于java - JAVA方法中的线程互斥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28109804/

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