gpt4 book ai didi

java - 同步块(synchronized block)锁定对象并等待/通知

转载 作者:行者123 更新时间:2023-12-03 23:18:15 24 4
gpt4 key购买 nike

据我了解,当我使用同步块(synchronized block)时,它会获取对象上的锁,并在代码块执行完毕时释放它。在下面的代码中

public class WaitAndNotify extends Thread{

long sum;

public static void main(String[] args) {
WaitAndNotify wan = new WaitAndNotify();
//wan.start();
synchronized(wan){
try {
wan.wait();
} catch (InterruptedException ex) {
Logger.getLogger(WaitAndNotify.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("Sum is : " + wan.sum);
}
}

@Override
public void run(){
synchronized(this){
for(int i=0; i<1000000; i++){
sum = sum + i;
}
notify();
}

}
}

如果 run 方法中的同步块(synchronized block)首先获取锁会发生什么?然后主方法内部的同步块(synchronized block)必须等待(不是因为wait(),因为另一个线程获得了锁)。 run 方法执行完成后,main 方法会不会进入它的同步块(synchronized block)并等待它永远不会得到的通知?我在这里误会了什么?

最佳答案

wait()暂时隐式退出相应的监视器并在返回时重新进入:

wait()

The current thread must own this object's monitor. The thread releases ownership of this monitor and waits until another thread notifies threads waiting on this object's monitor to wake up either through a call to the notify method or the notifyAll method. The thread then waits until it can re-obtain ownership of the monitor and resumes execution.



这就是这种同步工作的原因和方式。

关于java - 同步块(synchronized block)锁定对象并等待/通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31988857/

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