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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 新的开始 中级黑马   /  2016-3-25 22:24  /  744 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

不知道哪做的不对,有时候能锁住有时候不能锁住,求大神给看看

死锁线程.rar

912 Bytes, 下载次数: 96

8 个回复

倒序浏览
路过帮顶,我们也刚刚学
回复 使用道具 举报
可以在run方法中的if和else中写一个无限循环,应该就可以了,不是很懂
public void run() {
                if(flag) {//flag赋值为true时,执行的代码
                        while (true) {
                                synchronized (Test2.LOCK1) {
                                        System.out.println("if中锁1");
                                        synchronized (Test2.LOCK2) {
                                                System.out.println("if中锁2");
                                        }
                                }
                        }
                       
                } else {//flag赋值为false时,执行的代码
                        while (true) {
                                synchronized (Test2.LOCK2) {
                                        System.out.println("else中锁2");
                                        synchronized (Test2.LOCK1) {
                                                System.out.println("else中锁1");
                                        }
                                }
                        }
                       
                }
        }
回复 使用道具 举报
BugBuff 发表于 2016-3-25 23:46
可以在run方法中的if和else中写一个无限循环,应该就可以了,不是很懂
public void run() {
                if(flag) {//fl ...

好像不使用循环  
回复 使用道具 举报
wangze 发表于 2016-3-25 22:40
路过帮顶,我们也刚刚学

谢谢了。。。。。。。。。
回复 使用道具 举报
你的代码中死锁要发生必须是if里面thread在用Test2.LOCK1等待Test2.LOCK2,而else里面的thread2在用Test2.LOCK2,等待Test2.LOCK1。因为双方都获取到一个锁,都在等待对方的锁,因为等待,死锁就会发生。
但是线程的执行是没有顺序的,比如有可能thread已经获取到Test2.LOCK2,而thread2才进入run()呢?这样就不会被锁住。
加上循环或者人为让线程停止下来等待可以增加死锁的概率,加到一定范围死锁几乎必产生。
回复 使用道具 举报 1 0
luomoss 发表于 2016-3-26 11:16
你的代码中死锁要发生必须是if里面thread在用Test2.LOCK1等待Test2.LOCK2,而else里面的thread2在用Test2.L ...

好像有点明白了谢谢了
回复 使用道具 举报
谢兄,猜猜我是谁
回复 使用道具 举报
线程的死锁有什么用?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马