黑马程序员技术交流社区

标题: 为什么只有一个同步锁也会出现死锁情况 [打印本页]

作者: 张振纲    时间: 2012-8-2 00:47
标题: 为什么只有一个同步锁也会出现死锁情况
  1. class Ticket implements Runnable
  2. {
  3.         private int num = 100;
  4.         public void run()
  5.         {
  6.                 if (num >0)
  7.                 {
  8.                         synchronized(this)
  9.                                 {
  10.                                         {
  11.                                                 System.out.println(Thread.currentThread().getName()+"....."+num);
  12.                                                 num--;
  13.                                         }
  14.                                 }
  15.                 }
  16.         }
  17. }
  18. class SaleTicket
  19. {
  20.         public static void main(String[] args)
  21.         {
  22.                 Ticket t = new Ticket();
  23.                 Thread t1 = new Thread(t);
  24.                 Thread t2 = new Thread(t);
  25.                 Thread t3 = new Thread(t);
  26.                 //Thread t4 = new Thread(t);
  27.                 //Thread t5 = new Thread(t);

  28.                 t1.start();
  29.                 t2.start();
  30.                 t3.start();
  31.                 //t4.start();
  32.                 //t5.start();

  33.         }
  34. }
复制代码


作者: 金龙    时间: 2012-8-2 01:45
朋友,这个并不是死锁,而是你的代码是放在if语句中,并没有循环,后面创建了三个线程,每个线程都只执行一次就结束了,所以结果是100,99,98

        public void run()

        {

                if (num >0)//这里把if改成while,就好了

                {

                        synchronized(this)

                                {

                                        {

                                                System.out.println(Thread.currentThread().getName()+"....."+num);

                                                num--;

                                        }

                                }

                }

        }
作者: 叶征东    时间: 2012-8-2 02:12
本帖最后由 叶征东 于 2012-8-2 02:32 编辑

class Ticket implements Runnable

{

        private int num = 100;

        public void run()

        {

                if (num >0)//你这里没有构成循环,只是一个if语句 。所以三个线程各执行完一次之后就不再会执行了,只输出三次不是因为死锁了,而是因为线程执行完了。还有,将 if (num >0)放在 synchronized外面还是会出现安全问题的,因为(num>0)也涉及到num的运算, 所以应将if (num >0)放在synchronized里面。为了构成循环可以在synchronized外加在上while(true),但需手动停止程序,呵.


                {

                        synchronized(this)

                                {

                                        {

                                                System.out.println(Thread.currentThread().getName()+"....."+num);

                                                num--;

                                        }

                                }

                }

        }

}

class SaleTicket
{

        public static void main(String[] args)
        {

                Ticket t = new Ticket();

                Thread t1 = new Thread(t);

                Thread t2 = new Thread(t);

                Thread t3 = new Thread(t);

                //Thread t4 = new Thread(t);

                //Thread t5 = new Thread(t);


                t1.start();

                t2.start();

                t3.start();

                //t4.start();

                //t5.start();


        }

}
我将代码改了,可以参考下。
class Ticket implements Runnable

      private int num = 100;
      public void run()
      {
           while(true)
          {
                   synchronized(this)
                   {   
                         if (num >0
)
                         {
                                System.out.println(Thread.currentThread().getName()+"....."+num);
                                num--;
                          }
                    }
            }
       }

class SaleTicket
{
        public static void main(String[] args)
       {
              Ticket t = new Ticket();
              Thread t1 = new Thread(t);
              Thread t2 = new Thread(t);
              Thread t3 = new Thread(t);
             //Thread t4 = new Thread(t);
             //Thread t5 = new Thread(t);
              t1.start();
              t2.start();
              t3.start();
              //t4.start();
             //t5.start();
       }
}


作者: 胡文凡    时间: 2012-8-2 19:49
above is all right




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2