(多线程问题)本人小白,刚学Java多线程,遇到同步锁释放问题,下面直接贴代码

lyd_dream 2019-11-20 10:04:40
问题1:我预期是打印出 1,2,3,4,5 结果在3之后死锁了,
为什么执行到了resourceA.notify(); 而不会唤醒之前的 wait(),

问题2:我尝试把synchronized (resourceB) ,拿出去和synchronized (resourceA)同级,
不执行 resourceA.notify(); 也会唤醒resourceA.wait(),成功输出 4 和 5

public class WaitNotifyReleaseOwnMonitor {

private static volatile Object resourceA = new Object();
private static volatile Object resourceB = new Object();

public static void main(String[] args) {
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (resourceA) {
System.out.println("1");
synchronized (resourceB) {
System.out.println("2");
try {
resourceA.wait();
System.out.println("4");
// System.out.println("唤醒resourceA.wait");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
});

Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (resourceA) {
System.out.println("3");
resourceA.notify();

synchronized (resourceB) {
System.out.println("5");
}
}
}
});

thread1.start();
thread2.start();
}
}
...全文
129 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
dkwuxiang 2019-11-21
  • 打赏
  • 举报
回复
resourceA.notify(); 表示唤醒正在等待resourceA的线程,但是需要等待 thread2的resourceA同步块执行完毕,才会执行唤醒 thread2在resoureA.notify()后,还需要获取resourceB,打印5后才算执行完毕,而resourceB的锁目前在thread1中, 造成死锁了;
lyd_dream 2019-11-21
  • 打赏
  • 举报
回复
自顶,等待大佬来解答
qq_39936465 2019-11-21
  • 打赏
  • 举报
回复
引用 1 楼 lyd_dream 的回复:
自顶,等待大佬来解答
锁释放有2种方式,1是被锁程序执行完成,2是主动释放锁。 你的thread1执行未完成,却把resourceA和resourceB都锁死,然后自己进入了 resourceA.wait();等待状态并没有主动释放占有的锁,所以一直处于死锁状态,在进入等待前先要把自己持有的锁释放,不然其他的进程是无法取得锁的。

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧