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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© BitmapFactory 中级黑马   /  2013-3-14 10:19  /  1293 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张学林 于 2013-3-14 16:10 编辑
  1. /*写个死锁*/

  2. class Test implements Runnable
  3. {
  4.         private boolean flag;
  5.         Test(boolean flag)
  6.         {
  7.                 this.flag = flag;
  8.         }
  9.         public void run()
  10.         {
  11.                 if(flag)
  12.                 {
  13.                         while(true){
  14.                         synchronized(MyLock.locka)
  15.                         {
  16.                                 System.out.println("if locka");
  17.                                 synchronized(MyLock.lockb)
  18.                                 {
  19.                                         System.out.println("if lockb");

  20.                                 }
  21.                         }}
  22.                 }
  23.                 else
  24.                 {
  25.                         while(true){
  26.                         synchronized(MyLock.lockb)
  27.                         {
  28.                                 System.out.println("else lockb");
  29.                                 synchronized(MyLock.locka)
  30.                                 {
  31.                                         System.out.println("else locka");

  32.                                 }
  33.                         }}
  34.                 }

  35.         }
  36. }
  37. class MyLock
  38. {
  39.         static Object locka = new Object();
  40.         static Object lockb = new Object();
  41. }
  42. class DeadLockDemo
  43. {
  44.         public static void main(String[] args)
  45.         {
  46.                 Thread t1 = new Thread(new Test(true));//Test类又不是单例,这里不是创建了两个
  47.                 Thread t2 = new Thread(new Test(false));//对象吗,为啥会有死锁呢,难道在线程里创建对象都是创建的同一个对象吗?
  48.                 t1.start();
  49.                 t2.start();
  50.         }
  51. }
复制代码
在函数中Test类又不是单例,这里不是创建了两个对象吗,为啥会有死锁呢,难道在线程里创建对象都是创建的同一个对象吗?

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

1 个回复

倒序浏览
死锁:通常是同步中嵌套同步产生,理解了死锁出现的原因就明白了,
线程是创建了两个Thread t1 = new Thread(new Test(true));
                Thread t2 = new Thread(new Test(false));
对象是两个new Test(false)和new Test(true)但是锁只有两个,locka和lockb因为class MyLock中这两个所都是静态的,静态的是所有对象共享数据。
不管几个对象。他们用的都是这两把锁,所以在嵌套同步中出现死锁
如果你把locka和lockb定义成非静态的,在Test中new个对象,用对象调用,就不会出现死锁了,因为这时是四个锁了,同时这两个线程也不是同步了,不满足同步条件了
同步的前提:
1.必须要有两个或以上的线程
2.必须是多个线程使用同一个锁

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马