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

java线程死锁问题

java线程死锁问题

superkrissV 2015-02-15 21:50:12
public class TestDeadLock implements Runnable {     public static int flag =1;     public static Object o1;     public static Object o2;     @Override     public void run() {         // TODO Auto-generated method stub         System.out.println("flag = "+flag);         if(flag == 1){             synchronized(o1){                 try {                     Thread.sleep(5000);                 } catch (Exception e) {                     // TODO Auto-generated catch block                     e.printStackTrace();                 }             }             synchronized (o2) {                 System.out.println("1");             }         }         if(flag == 0){             synchronized (o2) {                 try {                     Thread.sleep(5000);                 } catch (Exception e) {                     // TODO Auto-generated catch block                     e.printStackTrace();                 }                 synchronized (o1) {                     System.out.println("0");                 }             }         }     }     public static void main(String[] args) {         TestDeadLock td1 = new TestDeadLock();         TestDeadLock td2 = new TestDeadLock();         td1.flag = 1;         td2.flag = 0;         Thread t1 = new Thread(td1);         Thread t2 = new Thread(td2);         t1.start();         t2.start();     } }flag = 0Exception in thread "Thread-0" Exception in thread "Thread-1" flag = 0java.lang.NullPointerException    at Thread.TestDeadLock.run(TestDeadLock.java:26)    at java.lang.Thread.run(Unknown Source)java.lang.NullPointerException    at Thread.TestDeadLock.run(TestDeadLock.java:26)    at java.lang.Thread.run(Unknown Source)上面是运行结果,编译没有问题,求解释。
查看完整描述

1 回答

已采纳
?
蓝胖子Torres

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

空指针了,要把o1和o2先实例化,才能给它加锁

查看完整回答
1 反对 回复 2015-02-15
  • superkrissV
    superkrissV
    public static Object o1 = new Object(); public static Object o2 = new Object(); 实例化对象之后,编译运行,过了sleep的时间后结果就出来了,并没有死锁,这是为什么?
  • 蓝胖子Torres
    蓝胖子Torres
    应为你的 o1和o2定义在了线程的内部,所以相当于线程自己的变量,要对一个全局对象加锁才能互斥
  • superkrissV
    superkrissV
    非常感谢!
  • 1 回答
  • 0 关注
  • 1939 浏览

添加回答

举报

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