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

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();

}

}
...全文
52 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
一剑风寒起 2011-12-18
  • 打赏
  • 举报
回复
static不懂用不要乱用啊!你在这里使用static没有意义(staic主用于资源共享,你在这里想共享什么?);
去掉static就可以了!死锁问题是各自拿不到所须的监视器发生的!为了保证死锁发生,应该廷长一下时间,增长线程切换的概率!
Flycutter 2011-12-18
  • 打赏
  • 举报
回复
顶楼上,而且最好要sleep一下,才容易看出死锁的效果,否则很难看到效果的
Jaya1989 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();

}

}

62,634

社区成员

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

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