gpt4 book ai didi

java - 如何确保java代码段有监视器

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

所以我正在编写一个介绍性的 java 程序来习惯多线程,但是,我在使用监视器时遇到了一些问题。特别是,当我进行 primes[0].notifyAll() 调用时,下面的代码部分会抛出 IllegalMonitorStateException。

    Integer[] primes=new Integer[3];
if(primes[0]>0{
{
synchronized(primes[0]){
int returning=primes[0];
primes[0]=0;
primes[0].notifyAll();
return returning;}
}

我对synchronized关键字的理解是,它确保在进入代码块之前拥有监视器,因此按照这个逻辑,我应该拥有用于notifyAll()调用的监视器。我是否误解了 Java 用于同步的策略,或者我实现该策略的方式是否存在一些错误?

最佳答案

问题是您已将一个新对象重新分配给 primes[0]。

synchronized(primes[0])

上面的语句已经在 primes[0] 引用的对象上进行了同步

primes[0]=0;

上面的语句现在已将一个新对象重新分配给 primes[0],而不是您拥有锁/监视器的对象。

primes[0].notifyAll();

最后,您尝试在新对象上调用notifyAll(),而不是您锁定的对象,因此会出现异常。

根据您想要实现的目标,以下内容可能会满足您的要求:

Integer[] primes=new Integer[3];
if(primes[0]>0) {
synchronized(primes[0]) {
int returning=primes[0];
primes[0]=0;
returning.notifyAll();
return returning;
}
}

关于java - 如何确保java代码段有监视器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5672073/

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