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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 冷冷丶丶 中级黑马   /  2014-9-18 10:49  /  921 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


class MyLock{
        static Object locka = new Object();
        static Object lockb = new Object();
}

class Test2 implements Runnable{
        private boolean flag;
        Test2(boolean flag){
                this.flag = flag;
        }
        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("if lockb");
                                        synchronized(MyLock.locka){
                                                System.out.println("if locka");
                                        }
                                }
                        }
                }
        }
}

public class DeadLockTest {

        public static void main(String[] args) {
                Thread t1 = new Thread(new Test2(true));
                Thread t2 = new Thread(new Test2(false));
                t1.start();
                t2.start();
        }
}

死锁:同步中嵌套同步

2 个回复

倒序浏览
哎!多线程感觉好难啊
回复 使用道具 举报
楼主把 locka和lockb 的静态属性去掉看看,结果会不一样哦。

例如我改成下面那样,为什么会没有出现死锁的情况?我也想知道原因。

class MyLock
{
      
        private final Object locka = new Object();     
        private final Object lockb = new Object();
       
        public Object getloka()
        {
                return locka;
        }
        public Object getlokb()
        {
                return lockb;
        }
}

class Test2 implements Runnable{
         MyLock m = new MyLock();
        private boolean flag;
        Test2(boolean flag){
                this.flag = flag;
        }
        public void run(){
                if(flag){
                        while(true){
                                synchronized(m.getloka()){
                                        System.out.println("if locka");
                                        synchronized(m.getlokb()){
                                                System.out.println("if lockb");
                                        }
                                }
                        }
                }
                else{
                        while(true){
                                synchronized(m.getlokb()){
                                        System.out.println("if lockb");
                                        synchronized(m.getloka()){
                                                System.out.println("if locka");
                                        }
                                }
                        }
                }
        }
}

public class DeadLockTest {

        public static void main(String[] args) {
                Thread t1 = new Thread(new Test2(true));
                Thread t2 = new Thread(new Test2(false));
                t1.start();
                t2.start();
        }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马