为了账号安全,请及时绑定邮箱和手机立即绑定

为什么这个死锁问题删除static就造不成死锁?

为什么这个死锁问题删除static就造不成死锁?

慕后森 2019-01-17 23:31:46
题目描述 这段代码是可以执行的,但是我删除static Object o1 = new Object(), o2 = new Object();前面的static,死锁问题就没了,求解答? 相关代码 public class TestDeadLock implements Runnable { int flag = 1; static Object o1 = new Object(), o2 = new Object(); public static void main(String[] args) { TestDeadLock tdl1 = new TestDeadLock(); TestDeadLock tdl2 = new TestDeadLock(); tdl1.flag = 0; tdl2.flag = 1; Thread t1 = new Thread(tdl1); Thread t2 = new Thread(tdl2); t1.start(); t2.start(); } @Override public void run() { System.out.println("flag:" + flag); if (flag == 0) { synchronized (o1) { try { Thread.sleep(1000); } catch (Exception e) { // TODO: handle exception } synchronized (o2) { System.out.println("0"); } } } if (flag == 1) { synchronized (o2) { try { Thread.sleep(1000); } catch (Exception e) { // TODO: handle exception } synchronized (o1) { System.out.println("1"); } } } } }
查看完整描述

2 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

因为在你使用static修饰以后o1 o2两个实例是静态实例,(在类被加载的时候就已经创建),不管你创建多少个TestDeadLock对象,他们都是同一个,所以不同的TestDeadLock实力访问的时候会造成锁等待,从而导致死锁的产生。
但是如果去除static这里的o1和o2只是成员属性,所以当你new不同的TestDeadLock对象的时候,他们其实是不同的对象,互相之间根本不受到影响(虽然代码层面看起来都是o1 o2,但实际程序运行的时候tdl1的o1 o2,和tdl2的o1 o2是不一样的,完全无关)

查看完整回答
反对 回复 2019-02-12
  • 2 回答
  • 0 关注
  • 389 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信