【求助】学完线程,写了个死锁的线程,但老报错,为什么?

h43857892 2011-12-18 12:56:43
public class Test5 implements Runnable {

int flag;
static Object o1,o2 = new Object();

public void run() {

if(flag==1){
synchronized (o1) {
System.out.println("拿到o1");
synchronized (o2) {
System.out.println("也拿到o2");
}
}
}

if(flag==2){
synchronized (o2) {
System.out.println("拿到o2");
synchronized (o1) {
System.out.println("也拿到o1");
}
}
}

}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Test5 t1 = new Test5();
t1.flag = 1;
Test5 t2 = new Test5();
t2.flag = 2;
Thread r1 = new Thread(t1);
Thread r2 = new Thread(t2);

r1.start();
r2.start();

}

}
...全文
31 点赞 收藏 3
写回复
3 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
一剑风寒起 2011-12-18
static不懂用不要乱用啊!你在这里使用static没有意义(staic主用于资源共享,你在这里想共享什么?);
去掉static就可以了!死锁问题是各自拿不到所须的监视器发生的!为了保证死锁发生,应该廷长一下时间,增长线程切换的概率!
回复
Flycutter 2011-12-18
顶楼上,而且最好要sleep一下,才容易看出死锁的效果,否则很难看到效果的
回复
假叶_jaya 2011-12-18
static Object o1,o2 = new Object();
这样只初始化了o2,o1没有初始化。

public class Test5 implements Runnable {

int flag;
static Object o1 = new Object(), o2 = new Object();

public void run() {

if (flag == 1) {
synchronized (o1) {
System.out.println("拿到o1");
synchronized (o2) {
System.out.println("也拿到o2");
}
}
}

if (flag == 2) {
synchronized (o2) {
System.out.println("拿到o2");
synchronized (o1) {
System.out.println("也拿到o1");
}
}
}

}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Test5 t1 = new Test5();
t1.flag = 1;
Test5 t2 = new Test5();
t2.flag = 2;
Thread r1 = new Thread(t1);
Thread r2 = new Thread(t2);

r1.start();
r2.start();

}

}
回复
相关推荐
发帖
Java SE
创建于2007-09-28

6.1w+

社区成员

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