15竹林风 2015-11-22 16:35 采纳率: 33.3%
浏览 1422
已采纳

java线程同步 死锁问题

写了一个java中线程同步的死锁问题,但是输出结果就是不对,劳烦前辈指点指点。源代码如下:
public class TestDeadLock implements Runnable{
public static 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(Exception e){
e.printStackTrace();
}

synchronized(o2){
System.out.print("1");
}
}图片说明
}
if(flag == 0){
synchronized(o2){
try{
Thread.sleep(500);
}catch(Exception e){
e.printStackTrace();
}

synchronized(o1){
System.out.print("0");
}
}
}
}
public static void main(String[] args) {
TestDeadLock testDeadLock1 = new TestDeadLock();
TestDeadLock testDeadLock2 = new TestDeadLock();
testDeadLock1.flag = 1;
testDeadLock2.flag = 0;
Thread t1 = new Thread(testDeadLock1);
Thread t2 = new Thread(testDeadLock2);
t1.start();
t2.start();
}

}
输的结果一直不是期待的那样子

  • 写回答

6条回答 默认 最新

  • R_水手 2015-11-22 17:27
    关注

    public static int flag = 1;
    改成
    public int flag = 1; 试下

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • 毕小宝 博客专家认证 2015-11-22 23:11
    关注

    你期待的结果是什么样子呢?你的代码里面有三个线程,main所在的线程首先把flag设置成0了,所以,另外两个线程操作时都是走入了flag=0的分支了。
    之所以没有发生死锁,是因为你的代码中暂用锁的线程Sleep时间是500,太短,而且都是flag=0的分支,锁顺序相同,线程1使用完成后就释放给线程2了,
    所以根本感受不到停顿就释放锁了,进入相同分支不会发生死锁。
    建议把sleep参数调大些如5000,那么看到打印出的00就是有先后顺序的。
    如果你想看到发生死锁,就需要想办法让两个线程分别进入flag=0和flag=1的分支,那么就会发生锁顺序死锁的问题了。
    参考:http://blog.csdn.net/wojiushiwo945you/article/details/45092501

    评论
  • havedream_one 2015-11-22 23:38
    关注

    testDeadLock1.flag = 1;
    testDeadLock2.flag = 0;
    这样最终flag=0
    当然就只会执行
    if(flag == 0){
    synchronized(o2){
    try{
    Thread.sleep(500);
    }catch(Exception e){
    e.printStackTrace();
    }

    synchronized(o1){
    System.out.print("0");
    }
    }

    评论
  • 紫气天堂 2015-11-23 01:30
    关注

    这个输出的话肯定是0啊,都走得是flag = 0 的分支

    评论
  • 君莫傲 博客专家认证 2015-11-24 01:06
    关注

    既然找到问题的所在了,我来吐个槽!。。

    评论
  • 君莫傲 博客专家认证 2015-11-24 01:08
    关注

    既然找到问题的所在了,我来吐个槽!。。

    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 burpsuite密码爆破
  • ¥15 关于#ubuntu#的问题,如何解决?(相关搜索:移动硬盘)
  • ¥15 scikit安装之后import不了
  • ¥15 Ros2编译一个使用opencv的c++节点的时候,报了这个错误,请问怎么解决啊
  • ¥15 人脸识别相关算法 YOLO,AI等
  • ¥15 spark问题方便加V17675797079
  • ¥15 Python代码不打印的原因
  • ¥20 微软SEAL库的安装和使用,VS2022环境配置问题
  • ¥15 数学问题也不知道那种类型的问题
  • ¥15 R作图的时候,文本框重叠了怎么办?