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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马李刚 黑马帝   /  2011-8-25 08:21  /  2678 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

期望运行结果是4个线程共享100张票,可实际运行结果为:买出的票远远大于100张(DOS命令行打印出101,102,....),更奇怪的是:将红色部分代码去掉,运行结果与期望相符,真是见了鬼了。。。
class MaiPiao implements Runnable
{
        private int ticket=100;
        
        public void run()
        {
                while(true)
                {
                        
                        if(ticket>0)
                               try{Thread.sleep(10);}catch(Exception e){}
                                System.out.println(Thread.currentThread().getName()+"我要卖票"+ticket--);
                }         
        }
}

class Class1
{
public static void main(String []args)
{

        MaiPiao xc=new MaiPiao();
      
        Thread t1=new Thread(xc);
        Thread t2=new Thread(xc);
        Thread t3=new Thread(xc);
        Thread t4=new Thread(xc);
                  
        t1.start();
        t2.start();
        t3.start();
        t4.start();
         
}
}
[ 本帖最后由 troyli1986 于 2011-08-25  09:23 编辑 ]

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

6 个回复

倒序浏览
哪有红色代码啊
你的线程根本就没用线程同步吗
这个应该在张老师的视频里面讲的很详细了吧
[ 本帖最后由 史卫平 于 2011-08-25  21:28 编辑 ]
回复 使用道具 举报
黑马网友  发表于 2011-8-25 08:52:50
藤椅
[quote] 原帖由 [i]史卫平[/i] 于 2011-08-25 08:37 发表 [url=http://bbs.itheima.com/redirect.jsp?goto=findpost&pid=8220&ptid=1260][img]http://bbs.itheima.com/images/common/back.gif[/img][/url]哪有好色代码啊

不理解楼上的意思   ………………
   

楼主请你把你的问题写清楚明白,别人会给你解答的    哪有红色的代码   我没有发现   ………………
回复 使用道具 举报
黑马网友  发表于 2011-8-25 08:55:20
板凳
你这太神奇了吧,ticket = 100怎么会有101.102出现呢,不过减到负数还是有可能性的,你的代码中有4个线程在共同操作同一个数据ticket,这样很容易产生线程安全问题,解决之道是要为可能产生线程的代码块加上锁,操作共享数据的代码是这里[quote] if(ticket>0)
                                try{Thread.sleep(10);}catch(Exception e){}
                                System.out.println(Thread.currentThread().getName()+"我要卖票"+ticket--);
                }       [/quote]
应该再外面加上synchronized(this)这句话,不过jdk1.5中提供了一种新的解决方案,代码如下:[code]class MaiPiao implements Runnable
{
        private int ticket=100;
         private Lock lock = new ReentrantLock();
        public void run()
        {
                while(true)
                {
                         lock.lock();
                        if(ticket>0)
                                try{Thread.sleep(10);}catch(Exception e){}
                                System.out.println(Thread.currentThread().getName()+"我要卖票"+ticket--);
                          lock.unlock();
                }         
        }
} [/code]

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-8-25 09:06:38
报纸
楼主,你看你的票减到负数倒是会的,因为在你的if判断里没有把“输出减减”那部分代码包含进去。

建议你还是好好看看张孝祥老师的关于线程的那些视频,很用帮助的。
回复 使用道具 举报
黑马网友  发表于 2011-8-25 10:33:53
地板
利用同步解决啊 不过我试了你这段代码了 没出现101 102呀 出现的-1 我帮你改了下 红色的地方。我也是刚学的 也请大家指点
class MaiPiao implements Runnable {
        private int ticket=100;
        public void run() {
                while(true){
                        if(ticket>0){
                                try{[color=Red]super.wait();}[/color]catch(Exception e){}
                                System.out.println(Thread.currentThread().getName()+"我要卖票"+ticket--);
                        [color=Red]}else{
                                break;[/color]}
                }
               
        }
}

class Class1{
        public static void main(String []args){
        MaiPiao xc=new MaiPiao();        
        Thread t1=new Thread(xc);
        Thread t2=new Thread(xc);
        Thread t3=new Thread(xc);
        Thread t4=new Thread(xc);
                  
        t1.start();
        t2.start();
        t3.start();
        t4.start();
        }
}
回复 使用道具 举报
张邦庆 黑马帝 2011-10-20 23:19:15
7#
[quote] 原帖由 史卫平 于 2011-08-25 08:37 发表
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马