黑马程序员技术交流社区

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

作者: lanbuohan    时间: 2013-7-5 15:08
标题: 线程问题
本帖最后由 巩建 于 2013-7-5 17:59 编辑

在线程问题上有很多得疑惑:
1、线程是怎么样做到死锁,死锁是因为是什么原因。
2、一个程序怎么样才能算是一个死锁程序呢。


作者: qmlovewhr    时间: 2013-7-5 15:19
1.线程死锁的原因产生死锁的原因主要是
因为系统资源不足。
进程运行推进的顺序不合适。
资源分配不当等。
如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。

产生死锁的四个必要条件
互斥条件:一个资源每次只能被一个进程使用。
请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。
2.所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象:死锁。”

作者: 谢孔营    时间: 2013-7-5 15:54
本帖最后由 谢孔营 于 2013-7-5 16:02 编辑

class A{

}
class B{

}
Test implements Runnable{
public void run(){
    synchronized(A.class){
             Thread.sleep(1000);
           System.out.println("拥有A锁")
       synchronized(B.class){
              System.out.println("拥有B锁");
        }
     }
  synchronized(B.class){
           Thread.sleep(1000);
           System.out.println("拥有B锁")
       synchronized(A.class){
              System.out.println("拥有A锁");
        }
     }
}
}
public MyTest{
   public staic void main(){
         Test t = newTest();
       Thread th1 = new Thread(t);
      Thread th2 = new Thread(t);
          th1.start();
          th2.start();
}
}
上面的程序根据自己的理解直接写的。格式不太好看。
首先自己建了两个锁,两个线程。
开启两个线程后,如果不发生死锁,则输出两对信息
如果发生死锁,只能输出一对,并且程序不会结束。
其实原因很简单:就是th1线程执行后,拥有A锁,往下执行需要B锁
th2线程执行后,拥有B锁,往下执行需要A锁。
两个线程都不释放自己所拥有的锁,这样就无法执行下去了,死锁了。

作者: x.love    时间: 2013-7-5 16:36
线程与线程间同时访问对方的资源而导致死锁。原因就是过多的同步,同步就是一段时间内只能一个线程访问共享资源。第二问:应该是运行不下去了,但是程序还一直运行着
作者: 赵海洋    时间: 2013-7-5 17:24
为了更好的维护论坛的学习氛围,如果您的的问题“已经解决”请即时联系版主将帖子状态改成“已解决”

-------------------坚持学习,黑马因你而精彩---------------
作者: 郑先明    时间: 2013-7-5 17:45
我这几天刚学到线程间通信, 对于死锁也是一知半解, 不过吧  我的理解暂时比较片面, 就是多个线程同时在线程池里停止运行, 然后就导致死锁了...
作者: lanbuohan    时间: 2013-7-5 19:21
郑先明 发表于 2013-7-5 17:45
我这几天刚学到线程间通信, 对于死锁也是一知半解, 不过吧  我的理解暂时比较片面, 就是多个线程同时在线程 ...

我昨天看到一个程序,这个程序就有一个死锁,就使A来B的钥匙,B拿A得钥匙,这样整个程序就不能再执行





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