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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. public class DeadLockDemo {
  2.         public static void main(String[] args) {
  3.                 Ticket3 ticket = new Ticket3();
  4.                 Thread t1 = new Thread(ticket);
  5.                 Thread t2 = new Thread(ticket);
  6.                 t1.start();
  7.                 try{Thread.sleep(10);}catch(Exception e){}
  8.                 ticket.flag = true;
  9.                 t2.start();
  10.         }
  11. }
  12. class Ticket3 implements Runnable {
  13.         private int ticket = 100;
  14.         public boolean flag = false;
  15.         Object obj = new Object();
  16.         @Override
  17.         public void run() {
  18.                 if (flag) {
  19.                         while (true) {
  20.                                 synchronized (obj) {
  21.                                         show();
  22.                                 }
  23.                         }
  24.                 } else {
  25.                         while (true) {
  26.                                 show();
  27.                         }
  28.                 }
  29.         }
  30.         private synchronized void show() {
  31.                 synchronized (obj) {
  32.                         if(ticket>0){
  33.                                 try{Thread.sleep(10);}catch(Exception e){}
  34.                                 System.out.println(Thread.currentThread().getName() + "..."
  35.                                                 + ticket--);
  36.                         }
  37.                 }
  38.         }
  39. }
复制代码


经过测试,使用this或者是类名.class,都不会发生死锁现象,求解释。

评分

参与人数 1技术分 +1 收起 理由
黄晓鑫 + 1

查看全部评分

3 个回复

倒序浏览
不一定非是object,只要保证每个线程拿到的锁对象是同一个对象就可以了
回复 使用道具 举报
锁要保证唯一 就不会死锁
回复 使用道具 举报
孤独的天奇 发表于 2014-1-19 00:14
不一定非是object,只要保证每个线程拿到的锁对象是同一个对象就可以了

恩,你说的对的。死锁发生的原因是两个不同的锁互相抢资源,也存在和谐的情况,我之前测试都是和谐的情况,可能和我的电脑是双核的cpu有关系。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马