黑马程序员技术交流社区

标题: 哪位大神可以说说多线程死锁的问题? [打印本页]

作者: 少先队员    时间: 2014-5-13 00:35
标题: 哪位大神可以说说多线程死锁的问题?
    请问死锁要必要掌握吗?  开发的时候会经常遇到死锁的问题吗?
作者: 钟成军    时间: 2014-5-13 01:15
  1. /*
  2. 死锁程序经典案例
  3. */

  4. class Test implements Runnable
  5. {
  6.         private boolean flag;
  7.         Test(boolean flag)
  8.         {
  9.                 this.flag = flag;
  10.         }
  11.         public void run()
  12.         {
  13.                 if(flag)
  14.                 {
  15.                         while(true)
  16.                         {
  17.                                 synchronized(MyLock.locka)
  18.                                 {
  19.                                         System.out.println("if locka");
  20.                                         synchronized(MyLock.lockb)
  21.                                         {
  22.                                                 System.out.println("if lockb");
  23.                                         }
  24.                                 }
  25.                         }
  26.                 }
  27.                 else
  28.                 {
  29.                         while(true)
  30.                         {
  31.                                 synchronized(MyLock.lockb)
  32.                                 {
  33.                                         System.out.println("else lockb");
  34.                                         synchronized(MyLock.locka)
  35.                                         {
  36.                                                 System.out.println("else locka");
  37.                                         }
  38.                                 }
  39.                         }
  40.                 }
  41.         }
  42. }

  43. class MyLock
  44. {
  45.         static Object locka = new Object();
  46.         static Object lockb = new Object();
  47. }

  48. class  DeadLockTest
  49. {
  50.         public static void main(String[] args)
  51.         {
  52.                 Thread t1= new Thread(new Test(true));
  53.                 Thread t2= new Thread(new Test(false));
  54.                 t1.start();
  55.                 t2.start();

  56.         }
  57. }
复制代码

应该都要掌握啊,死锁也不是很难,理解能写得出死锁就基本可以了,在开发中不一定会遇到,但你一定知道有这回事,以免出现了问题不知道哪里出的问题,以以是一个死锁的经典代码




作者: 彭飞    时间: 2014-5-13 13:51
:L
死锁都忘了。
代码借来看看。。。。。

作者: pandapan    时间: 2014-5-14 22:26
本帖最后由 pandapan 于 2014-5-14 22:27 编辑

不愧是程序员呀,上来都喜欢直接写代码, 这样直接写出来确实证明自己很强悍,但是是不是符合提问者的要求呢?
1.多线程中死锁确实是要求掌握的,尤其是如果想做安卓方面的,这个属于多线程的必备知识,面试中应该会经常遇到的。
2.开发过程中一般是没有人故意写死锁的程序的,但是不免还是会遇到的,遇到之后就要会解决,因而就要理解死锁的发生
3.死锁的发生,是伴随着抢占资源而发生的,比如说线程A和线程B在运行着,A先抢占LockA锁,获得后然后才会去获得LockB锁,而线程B在运行时先会抢占LockB锁,获得后然后才会去获得LockA锁。我们应该知道的是线程会在任意时刻切换,因而有可能发生的是线程A恰好抢了LockA后,CPU切换了线程B运行,线程B恰好抢了LockB后继续运行,此时A要继续运行需要LockB,但是已经被B用着,B要继续运行需要LockA,但是已经被A用着,因而两个线程就开始相互僵持着,就死锁了。
4.至于例子嘛,就是 @钟成军 所写的经典案例,记得毕向东老师在java基础视频中讲到过,你可以再学习学习细节。




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