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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 、__WSD吴少东 中级黑马   /  2013-4-15 10:08  /  1406 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 、__WSD吴少东 于 2013-4-15 13:35 编辑
  1. class Ticket implements Runnable
  2. {
  3.         private int tick = 10000;
  4.         Object obj = new Object();
  5.         boolean flag = true;
  6.         public void run()
  7.         {
  8.                 if(flag)//使用if else 进行转换。
  9.                 {
  10.                         while(true)
  11.                         {
  12.                                 synchronized(obj)
  13.                                 {
  14.                                         show();//要执行的代码
  15.                                 }
  16.                         }
  17.                 }
  18.                 else
  19.                         while(true)
  20.                                 show();//要执行的代码
  21.         }
  22.         public synchronized void show()//同步函数,用的是this锁
  23.         {
  24.                 synchronized(obj)
  25.                 {
  26.                         if(tick>0)
  27.                         {
  28.                                 try{Thread.sleep(10);}catch(Exception e){}
  29.                                 System.out.println(Thread.currentThread().getName()+"........."+tick--);
  30.                         }
  31.                 }
  32.         }
  33. }

  34. class  SiSuo
  35. {
  36.         public static void main(String[] args)
  37.         {
  38.                 Ticket t = new Ticket();//创建资源

  39.                 Thread t1 = new Thread(t);//创建t资源的线程
  40.                 Thread t2 = new Thread(t);
  41.                 t1.start();//启动线程
  42.                 try{Thread.sleep(10);}catch(Exception e){}
  43.                 t.flag = false;
  44.                 t2.start();
  45.         }
  46. }
复制代码
  1. class Tick implements Runnable
  2. {
  3.         boolean fals;

  4.         Tick(boolean fals)
  5.         {
  6.                 this.fals = fals;
  7.         }
  8.         public void run()
  9.         {
  10.                 if(fals)
  11.                 {
  12.                         while(true)
  13.                         {
  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.                 }
  24.                 else
  25.                 {
  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 SiSuo1
  43. {
  44.         public static void main(String[] args)
  45.         {
  46.                 Thread t1 = new Thread(new Tick(true));    //这里想不明白,这是不是创建了两个不同的对象?  和第一种死锁有什么不同的地方。除了锁
  47.          Thread t2 = new Thread(new Tick(false));
  48.                 t1.start();
  49.                 t2.start();
  50.         }
  51. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

2 个回复

倒序浏览
第二个是创建了两个对象...
但是他们的锁是MyLock的两个成员.....
第一个代码的锁是Ticket本身的东西...
主要的区别就是
第一个只能有一个目标Runable子类实现死锁
第二个可用两个目标Runnable子类实现死锁,就是因为用的锁是第三方的东西

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
刘胜寒 发表于 2013-4-15 10:43
第二个是创建了两个对象...
但是他们的锁是MyLock的两个成员.....
第一个代码的锁是Ticket本身的东西...

那意思是不是说,想要用两个对象实现死锁,就必须要用第三方的锁,否则就只能使用第一种方法,是这个意思吧?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马