黑马程序员技术交流社区

标题: 关于线程死锁问题 [打印本页]

作者: MarsBong    时间: 2016-9-11 23:15
标题: 关于线程死锁问题
两个线程各自锁了一把锁,然后又要执行另一把锁的内容,不在同一个代码块中,但是是使用的同一个锁,怎么会造成死锁

作者: jiubaK    时间: 2016-9-11 23:33
确定是同一把锁?
作者: MarsBong    时间: 2016-9-11 23:40
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执行不进去了?
作者: jiubaK    时间: 2016-9-11 23:53
MarsBong 发表于 2016-9-11 23:40
对啊,一个方法中是锁AB ,另一个方法中是锁BA,
-public class DeadLockThread extends Thread {
-        boolean ...

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




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2