黑马程序员技术交流社区

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

作者: 黄克帅    时间: 2012-5-28 10:45
标题: [已解决]关于线程死锁的问题
本帖最后由 黄克帅 于 2012-5-28 17:59 编辑

看毕老师的视频中关于死锁的那段代码,谁能详细说一下死锁形成的过程。还有我这段代码运行死锁概率不高,请问 死锁水产的概率一般与什么有关
public class ThreadOne implements Runnable {

        private int tick = 100;
        boolean flag = true;

        Object obj = new Object();

        public void run() {
                if (flag) {
                        while (true) {
                                synchronized (obj) { //obj锁里面有this锁
                                        show();
                                }

                        }
                }

                else {
                        while (true) {
                                show();
                        }
                }
        }

        private synchronized void show() { //this锁里面有obj锁
               
                synchronized (obj) {
                        
                        if (tick > 0) {
                                try {
                                        Thread.sleep(10);
                                        System.out.println(Thread.currentThread().getName() + "---code:"
                                                        + tick--);
                                } catch (InterruptedException e) {
                                        e.printStackTrace();
                                }
                        }
                }
        }

}


public class ThreadTest {

        public static void main(String[] args) {
                ThreadOne to = new ThreadOne();
                Thread t1 = new Thread(to);
                Thread t2 = new Thread(to);
               
                t1.start();
                try {
                        Thread.sleep(10);
                } catch (InterruptedException e) {
                        e.printStackTrace();
                }
                to.flag=false;
                t2.start();
                                
        }
}
作者: 黑马—陈磊    时间: 2012-5-28 11:07
产生死锁的原因:一是系统提供的资源数量有限,不能满足每个进程的使用;二是多道程序运行时,进程推进顺序不合理。

产生死锁的必要条件是:1、互斥条件;2、不可剥夺条件(不可抢占);3、部分分配;4、循环等待。

根据产生死锁的四个必要条件,只要使其中之一不能成立,死锁就不会出现。为此,可以采取下列三种预防措施:
1、采用资源静态分配策略,破坏"部分分配"条件;
2、允许进程剥夺使用其他进程占有的资源,从而破坏"不可剥夺"条件;
3、采用资源有序分配法,破坏"环路"条件。

死锁的避免不严格地限制死锁的必要条件的存在,而是系统在系统运行过程中小心地避免死锁的最终发生。最著名的死锁避免算法是银行家算法。死锁避免算法需要很大的系统开销。

解决死锁的另一条途径是死锁检测方法,这种方法对资源的分配不加限制,即允许死锁的发生。但系统定时地运行一个"死锁检测"程序,判断系统是否已发生死锁,若检测到死锁发生则设法加以解除。

解除死锁常常采用下面两种方法:1、资源剥夺法;2、撤消进程法
作者: 黑马张健    时间: 2012-5-28 11:57
我本人觉得,死锁与外因无关(外因:业务的复杂、数据量的庞大)
死锁与自己写的代码的安全性有关,在写多线程程序时,对问题的分析以及可能出现的问题预测有关。
也就是提前做好出现问题的可能性准备,在写代码,会比较更安全。
要想写出安全的多线程代码,与工作阅历工作经验这些有关。
作者: 袁錦泰    时间: 2012-5-28 13:39
本帖最后由 袁錦泰 于 2012-5-28 15:19 编辑
黑马—陈磊 发表于 2012-5-28 11:07
产生死锁的原因:一是系统提供的资源数量有限,不能满足每个进程的使用;二是多道程序运行时,进程推进顺序 ...

1.资源静态分配策略指的是什么?破坏"部分分配"条件指的是什么?
2.资源有序分配法指的是什么?请具体讲解.
3.请将银行家算法的源代码写出并加以说明.
4."死锁监测"程序解除死锁发生的原理.
5."资源剥夺法"与"撤销进程法"的说明实例.
作者: 袁錦泰    时间: 2012-5-28 15:17
本帖最后由 袁錦泰 于 2012-5-28 15:21 编辑
袁錦泰 发表于 2012-5-28 13:39
1.资源静态分配策略指的是什么?破坏"部分分配"条件指的是什么?
2.资源有序分配法指的是什么?请具体讲解.
...

前些日子已经碰到一个类似形式的答案了,回答得比较高深.
我问了他几个问题后直到今天都没有回复我,其实我是真不懂,谁知人家不鸟我.




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