死锁问题,求助。在线等

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() ;
}
}
...全文
70 点赞 收藏 2
写回复
2 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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对象是不一样的。所以没有存在相互等待对方释放锁得现象
回复
相关推荐
发帖
Java SE
创建于2007-09-28

6.1w+

社区成员

Java 2 Standard Edition
申请成为版主
帖子事件
创建了帖子
2011-11-08 11:37
社区公告
暂无公告