Java多线程中,为什么使用了synchronized,还要唤醒才不发生死锁呢?死锁是wait()特有的?

Java多线程中,为什么使用了synchronized,还要唤醒才不发生死锁呢?死锁是wait()特有的?

private int n;

boolean flag=false;


public synchronized int get() {

if(!flag) {

try {

wait();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

System.out.println("消费:"+n);

flag=false;//消费完毕,容器中没有数据

notifyAll();

return n;

}


public synchronized void set(int n) {

if(flag) {

try {

wait();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

System.out.println("生产:"+n);

this.n = n;

flag=true;//生产完毕,容器中已经有数据

notifyAll();

}


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小小 2021-06-08 10:44:32

同学你好,1、线程一旦执行wait()方法,当前线程就进入阻塞状态,并释放同步监视器。只有调用唤醒方法,才会唤醒被wait的线程,未唤醒 被wait的线程则一致处于阻塞状态。

2、死锁不是wait特有的。死锁指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。

简单来说,当A线程等待B线程持有的,同时B线程也等待A线程持有的时,就会发生死锁现象。死锁并不是wait特有 的。

祝学习愉快~

  • 提问者 童真模式启动 #1
    1、执行了wait(),线程就进入阻塞,可是为什么有时候没有notifyAll()可以进行运行好多轮?


    2021-06-08 22:38:42
  • ​同学你好,线程执行了wait()后,没有被唤醒,则该线程一致处于阻塞状态无法继续执行。
    建议同学上传代码,我们帮忙查看一下具体原因。

    祝学习愉快~

    2021-06-09 10:04:03
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师