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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

这是毕老师在多线程安全课上讲的卖票的例子,我自己敲了一遍,可运行结果还是出-2,-1,0号票,我和老师的代码对照了好些遍,没差别丫,也运行了好多遍,结果还是出负数票,大伙给看看,啥问题?

class thread implements Runnable
{

        private static int tick=100;
        Object o=new Object ();
        public void run()
        {
                while(true)
                {
               
                        synchronized (o)
                        {
                                if(tick>0)
                                {
                                        try
                                        {
                                                Thread.sleep(5);
                                        }
                                        catch (Exception e)
                                        {
                                        }
                                System.out.println(Thread.currentThread().getName()+"售票"+tick--);
                                }
                        }
                }
        }
}
class  ticket
{
        public static void main(String[] args)
        {
                thread t1=new thread();
                thread t2=new thread();
                thread t3=new thread();
                thread t4=new thread();
                new Thread (t2).start();
                new Thread (t1).start();
                new Thread (t3).start();
                new Thread (t4).start();
        }
}

运行结果

D:\java12\day08>java ticket1
Thread-0售票100
Thread-1售票97
Thread-2售票98
Thread-3售票99
Thread-0售票96
。。。
Thread-0售票4
Thread-3售票3
Thread-2售票2
Thread-1售票1
Thread-0售票0
Thread-2售票-1
Thread-3售票-2

9 个回复

倒序浏览
class thread implements Runnable
{

        private static int tick=100;
         Object o=new Object ();
         public void run()
         {
                 while(true)
                 {
                 
                        synchronized (o)
                         {
                                 if(tick>0)
                                 {
                                         try
                                         {
                                                 Thread.sleep(5);
                                         }
                                         catch (Exception e)
                                         {
                                         }
                                 System.out.println(Thread.currentThread().getName()+"售票"+tick--);
                                 }
                         }
                 }
         }
}
class  ticket
{
         public static void main(String[] args)
        {
                 thread t1=new thread();
             //    thread t2=new thread();
             //    thread t3=new thread();
            //     thread t4=new thread();
                       
           //      new Thread (t2).start();
            //     new Thread (t1).start();
             //    new Thread (t3).start();
              //   new Thread (t4).start();
                          //这里写错了
                                Thread m1 = new Thread(t1);
                                Thread m2 = new Thread(t1);
                                Thread m3 = new Thread(t1);
                                Thread m4 = new Thread(t1);
                                m1.start();
                                m2.start();
                                m3.start();
                                m4.start();
         }
}
回复 使用道具 举报
本帖最后由 段浩亮 于 2012-3-19 10:42 编辑

你建了4个thread对象,4个线程分别执行的是4个对象里的run方法,有四把锁,把代码改成这样
thread t1=new thread();
                   new Thread (t1).start();
            //     new Thread (t1).start();
             //    new Thread (t1).start();
              //   new Thread (t1).start();
回复 使用道具 举报
1.你应该创建四个线程,即new出四个Thread类对象;
2.你应该创建一个实现Runnable接口的子类对象;
3.你要将Runnable接口的子类对象作为参数传递给线程的构造函数。
回复 使用道具 举报
李创 发表于 2012-3-19 10:24
class thread implements Runnable
{

哥们,你说的对呢,我代码的错误错在,那样的话,就有4个Object对象,相当于有4把锁,各用各的,相当于没锁。
回复 使用道具 举报
段浩亮 发表于 2012-3-19 10:31
你建了4个thread对象,4个线程分别执行的是4个对象里的run方法,有四把锁,把代码改成这样
thread t1=new thre ...

谢谢。。。。
回复 使用道具 举报
阿牛 中级黑马 2012-3-19 11:28:52
7#
李创 发表于 2012-3-19 10:24
class thread implements Runnable
{

我试验了下,把Object对象static下,就我原来的代码不改下面的也可以了。
回复 使用道具 举报
阿牛 中级黑马 2012-3-19 11:31:09
8#
段浩亮 发表于 2012-3-19 10:31
你建了4个thread对象,4个线程分别执行的是4个对象里的run方法,有四把锁,把代码改成这样
thread t1=new thre ...

我试验了下,把Object对象static下,就我原来的代码不改下面的也可以了。
回复 使用道具 举报
太牛了兄弟这么一搞你搞了4把锁
回复 使用道具 举报
OMG 中级黑马 2012-3-19 14:27:33
10#
class thread implements Runnable
哥们,类名首字母应该大写哦!但大写成Thread又和线程类冲突,真要thread这个词的话,就写成 ThreadXX吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马