黑马程序员技术交流社区

标题: 多线程问题 [打印本页]

作者: .......    时间: 2014-2-19 16:45
标题: 多线程问题
多线程中造成死锁的原因是不是 第2个线程拿着第三个线程的钥匙 第三个线程拿着第二个线程的钥匙?
作者: 榨菜    时间: 2014-2-19 17:20
貌似这样  我也不怎么理解。。   多在等待对方释放资源,然后就锁住了。  
作者: ___________゛M    时间: 2014-2-19 17:28
数据库书 和 操作系统书上都有  你可以看看  :
产生死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
作者: skyname    时间: 2014-2-19 19:50
死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。发生死锁的原因一般是两个对象的锁相互等待造成的。通常,死锁的出现是同步中嵌套同步。
那么为什么会产生死锁呢?
1.因为系统资源不足。
2.进程运行推进的顺序不合适。   
3.资源分配不当。
操作系统的书上写的,死锁产生的条件有四个:
1.互斥条件:所谓互斥就是进程在某一时间内独占资源。
2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3.不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。
4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
死锁是因为多线程访问共享资源,由于访问的顺序不当所造成的,通常是一个线程锁定了一个资源A,而又想去锁定资源B;在另一个线程中,锁定了资源B,而又想去锁定资源A以完成自身的操作,两个线程都想得到对方的资源,而不愿释放自己的资源,造成两个线程都在等待,而无法执行的情况。
我们在java中使用synchonized的时候要考虑这个问题,如何解决死锁,可以从死锁的四个条件去解决,只要破坏了一个必要条件,那么就不会产生死锁。在java中使用多线程的时候一定要考虑是否有死锁的问题。





作者: joure    时间: 2014-2-19 20:24
举例比较常见的死锁,
        每个同步只有一个对应的锁,相互嵌套时同时持有两个锁才会执行,一旦两个同步都持有一个对方的锁无法执行也无法释放,就会导致线程死锁

如下面这两个run方法同时执行,就会造成死锁
            public void run()  {  
        synchronized(MyLock.a)  {  
            synchronized(MyLock.b)        {
                                .....;
            }  
        }  
    }  
            public void run()  {  
        synchronized(MyLock.b)  {  
            synchronized(MyLock.a)        {
                                .....;
            }  
        }  
    }
作者: Amorvos    时间: 2014-2-19 22:41
本帖最后由 Amorvos 于 2014-2-19 22:43 编辑

如果是两个线程的话造成死锁的原因是thread0已经持有锁1,thread1已经持有锁2,
此时thread0运行到代码需要申请锁2,但锁1不释放
此时thread1运行到代码需要申请锁1,但锁2不释放
由于thread0持有的锁1与thread1持有的锁2均未释放,两个线程相互等待。
这与造成操作系统死锁的原因是一样的,可以帮助你理解,即一个资源每次只能被一个进程使用;一个进程因请求资源而阻塞时,对已获得的资源保持不放;进程已获得的资源,在末使用完之前,不能强行剥夺;干进程之间形成一种头尾相接的循环等待资源关系。






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