A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵学刚 中级黑马   /  2012-12-1 16:49  /  1196 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 赵学刚 于 2012-12-3 12:58 编辑

/**
* 死锁测试

*/
public class test6 implements Runnable {
private boolean flag;
test6(boolean flag){
          this.flag=flag;
                     }




@Override
public void run() {
        
          if(flag){ while(true){
                  synchronized(MyLock.locka){
                          System.out.println("if locka");
                          synchronized(MyLock.lockb){
                                  System.out.println("if lockb");
                          }
                  }
                }
          }
        
        else{   while(true){
                      synchronized(MyLock.lockb){
                              System.out.println("else lockb");
                              synchronized(MyLock.locka){
                                      System.out.println("else locka");
                              }
                      }
          }
        }

}        
static class MyLock {
        static  Object locka=new Object();
        static Object lockb=new Object();
}
public static void main(String[] args) {
        Test6 t=new Test6(true);
        Thread t1=new Thread(t);
        Thread t2=new Thread(t);
        t1.start();
        t2.start();
}
}

为什么不会死锁,而是一直打印不会停呢

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

3 个回复

倒序浏览
1、始终没有改变flag的值
2、你的if判断在while循环外,即使在循环中改变了flag值,也不会走到else里

稍微改下run方法:

int x = 0;
while (true) {
        if (x == 0) {
                synchronized (MyLock.locka) {
                                System.out.println("if locka");
                                synchronized (MyLock.lockb) {
                                        System.out.println("if lockb");
                                }
                        }
                } else {
                        synchronized (MyLock.lockb) {
                                System.out.println("else lockb");
                                synchronized (MyLock.locka) {
                                        System.out.println("else locka");
                                }
                        }
                }
                x = (x + 1) % 2;
        }
回复 使用道具 举报
嗯  谢谢   根据你给的提示  多加了个传入对象   
       Thread t1=new Thread(new Test6(true));
        Thread t2=new Thread(new Test6(false));
        t1.start();
        t2.start();
现在可以运行了  
回复 使用道具 举报
问题已解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马