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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. /*
  2. 需求:死锁程序
  3. */
  4. class SiSuo
  5. {
  6.         public static void main(String[] args)
  7.         {
  8.                 Suo s=new Suo();
  9.                 Thread t1=new Thread(s);
  10.                 Thread t2=new Thread(s);
  11.                 t1.start();
  12.                 t2.start();
  13.         }
  14. }
  15. class Suo implements Runnable
  16. {
  17.         private int num=1000;
  18.         Object obj=new Object();
  19.         public void run()
  20.         {
  21.                 while(true)
  22.                         synchronized(obj)
  23.                         {
  24.                                 show();
  25.                         }

  26.         }
  27.         public synchronized void show()
  28.         {
  29.                 synchronized(obj)
  30.                 {
  31.                         if(num>0)
  32.                                 System.out.println(Thread.currentThread().getName()+"show......"+num--);
  33.                 }
  34.         }

  35. }
复制代码
怎么我运行了好几次都没有锁住啊???

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

2 个回复

倒序浏览
在你synchronized() 这个语句里面 应该是传入 this 对象,表示的
是锁住当前调用该方法的对象,即:锁住当前线程,当前对象

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
你的程序中两个线程t1和t2都必须先获得obj对象持有的锁,才能执行,根本就不能死锁

        public void run()

        {

                while(true)

                        synchronized(obj)//此处t1和t2都必须先获得obj对象持有的锁

                        {

                                show();

                        }
    }
要想死锁必须让t1和t2两个线程同时持有两个不同的锁,并且都不释放锁,而且都想要对方的锁。

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

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