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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© MarsBong 中级黑马   /  2016-9-11 23:15  /  890 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

两个线程各自锁了一把锁,然后又要执行另一把锁的内容,不在同一个代码块中,但是是使用的同一个锁,怎么会造成死锁

3 个回复

倒序浏览
确定是同一把锁?
回复 使用道具 举报
jiubaK 发表于 2016-9-11 23:33
确定是同一把锁?

对啊,一个方法中是锁AB ,另一个方法中是锁BA,
-public class DeadLockThread extends Thread {
-        boolean flag;//定义标记,用来指定要执行的代码
-        public DeadLockThread(boolean flag) {
-                this.flag = flag;
-        }
-        @Override
-        public void run() {
-                if(flag) {//flag赋值为true时,执行的代码
-                        synchronized (锁1) {
-                                System.out.println("if中锁1");
-                                synchronized (锁2) {
-                                        System.out.println("if中锁2");
-                                }
-                        }
-                } else {//flag赋值为false时,执行的代码
-                        synchronized (锁2) {
-                                System.out.println("else中锁2");
-                                synchronized (锁1) {
-                                        System.out.println("else中锁1");
-                                }
-                        }
-                }
-        }
-}


if中还是锁住1,else中锁住2.为什么就是if中的锁2执行不进去,else中的锁1执行不进去了?
回复 使用道具 举报
MarsBong 发表于 2016-9-11 23:40
对啊,一个方法中是锁AB ,另一个方法中是锁BA,
-public class DeadLockThread extends Thread {
-        boolean ...

额,你这个明明就是两个锁嘛。。。
其实死锁,你知道死在那里了吗?
在if中,一个线程拿到了锁1,在else中另一个线程拿到了锁2,
那么,就造成了死锁。
因为两个线程都不能继续了,都在等对方释放锁。
虽然这个情况在个人机子上很少发生,但不得不承认,它还是能发生。
在很多用户使用时,那么死锁就是非常可能出现的了。
所以,写程序就要考虑好,使用多个锁嵌套时,要注意锁的顺序一定要相同。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马