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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© aaronwang 中级黑马   /  2015-4-9 19:15  /  436 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 aaronwang 于 2015-4-9 19:18 编辑

    作为一名零基础自学毕老师精彩视频的学渣,时不时会有搞不懂的状况。这次是死锁”(11天-15-死锁),毕老师给出了示例,代码见最下面。
    程序试着运行几次,都锁住了,结果有两种,一种if a else b,另一种是else b if a. 一直没出现和谐情况 细想之下,在else块中首行添加下句代码可以实现全部打印的目的
         Thread.sleep(10);
    看过视频的哥们都知道,这是毕老师生造出来的小例子,仅为说明死锁,没啥需要解决的问题。之后我琢磨了一个小例子来说明同步嵌套同步造成的死锁现象,给同样对该现象有疑惑的初学者们分享下。。。

需求:俩人(小黑和小白)管理仓库1和仓库2,现在需要分别在俩仓库里拿点货。
说明:看图,门1(M1)和门2(M2)分别用对应的钥匙打开。然后总共只有一套钥匙(保证钥匙撒手前对方是拿不到的)
正常状况:
——小黑:来来来,老板让取笔和墨,我库房里有笔,白白你房里有墨。麻利点,赶紧的……
——小白:跟我亲热个毛……我要拿Employee of the month,赶紧冲
然后俩人各抄起外门的钥匙就冲向库房了。结果,里门没钥匙,外门也自动锁上了。俩人都挂了……
和谐情况:
——
小黑:(脑子里飘过:我真的好爱他,我的小白)白,钥匙你都拿着,我等你……取了墨先送过去吧,别让头等急了……拿完把钥匙给我就成
——小白:呃……

顺便提下毕老师说面试有可能会让写一个死锁的小例。
  1. public class DeadLockTest {
  2.         public static void main(String[] args) {
  3.                 Test t1 = new Test(true);
  4.                 Test t2 = new Test(false);
  5.                
  6.                 new Thread(t1).start();
  7.                 new Thread(t2).start();
  8.         }
  9. }

  10. class MyLock {
  11.         static Object a = new Object();
  12.         static Object b = new Object();
  13. }

  14. class Test implements Runnable {
  15.         public Test(boolean flag) {
  16.                 this.flag = flag;
  17.         }

  18.         private boolean flag;
  19.        
  20.         public void run() {
  21.                 if(flag) {
  22.                         synchronized(MyLock.a) {
  23.                                 System.out.println("if a");
  24.                                 synchronized(MyLock.b) {
  25.                                         System.out.println("if b");
  26.                                 }
  27.                         }
  28.                 } else {
  29.                         try {
  30.                                 Thread.sleep(10);//添加本条代码可实现和谐状态。
  31.                         } catch (InterruptedException e) {
  32.                                 e.printStackTrace();
  33.                         }
  34.                         synchronized(MyLock.b) {
  35.                                 System.out.println("else b");
  36.                                 synchronized(MyLock.a) {
  37.                                         System.out.println("else a");
  38.                                 }
  39.                         }
  40.                 }
  41.         }
  42. }
复制代码


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马