死锁问题,求助。在线等

yangkaiyi_java 2011-11-08 11:37:14
我看了视屏自己写了下让线程死锁的代码,是这样的下面这样的,如果我把static Object o1 = new Object() ;static Object o2 = new Object() ;2个new出来的对象前面的static 去掉的话就不会死锁了,不知道什么原因 求助


public class TestDeadLock implements Runnable {
public int flag = 1 ;
static Object o1 = new Object() ;
static Object o2 = new Object() ;
public void run() {
System.out.println("flag="+flag) ;
if(flag == 1) {
synchronized(o1) {
try{
Thread.sleep(500) ;
}catch(InterruptedException e) {
e.printStackTrace() ;
}
synchronized(o2) {
System.out.println("1") ;
}
}
}
if(flag == 2) {
synchronized(o2) {
try {
Thread.sleep(500) ;
}catch(InterruptedException e) {
e.printStackTrace() ;
}
synchronized(o1) {
System.out.println("2") ;
}
}
}
}
public static void main(String[] args) {
TestDeadLock test1 = new TestDeadLock() ;
TestDeadLock test2 = new TestDeadLock() ;
test1.flag = 1 ;
test2.flag = 2 ;
Thread t1 = new Thread(test1) ;
Thread t2 = new Thread(test2) ;
t1.start() ;
t2.start() ;
}
}
...全文
83 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangkaiyi_java 2011-11-09
  • 打赏
  • 举报
回复
那静态是个什么概念,我还是没弄清楚,怎么运用
wode_java 2011-11-08
  • 打赏
  • 举报
回复
静态的时候,两个线程公用的是同一个o1和o2,所以在执行的过程中,如果线程1获取o1对象的锁,正要获取o2对象的锁得时候,线程2或得到了o2对象的锁,同时线程2在等待获取o1对象的锁,这样就造成了死锁。
而没有静态的时候,线程1、线程2拥有各自的对象o1,o2也就是说线程1的o1、o2对象和线程2的o1、o2对象是不一样的。所以没有存在相互等待对方释放锁得现象

62,614

社区成员

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

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