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

© 郑飞 高级黑马   /  2014-6-25 02:43  /  1501 人查看  /  1 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郑飞 于 2014-6-25 02:47 编辑

class Ticket implements Runnable
{
        private int tick = 100;
        public void run()
        {
                while(true)
                {
                                synchronized(Ticket.class)
                                {
                                        if(tick>0)
                                        {
                                                try{Thread.sleep(10);}catch(Exception e){}
                                                System.out.println(Thread.currentThread().getName()+"==maipiao----"+tick--);
                                        }
                                }                     
                 }
        }
}

class TicketDemo
{
        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);
                        t1.start();        
                        t2.start();
                        t3.start();
                        t4.start();
         }
}

上面代码运行后没问题

问题出在 1.不用synchronized的时候 运行4线程 打印完后 鼠标龟速 机子卡的要命 只能1-3线程运行正常
               
               2.用了synchronized后 几个线程都正常
               
               这后面的原理是什么啊 为什么这种情况 我看视频里运行4线程也没问题啊?

1 个回复

倒序浏览
关键点在于 while(true),楼主也说明了,这个卡机现象是打印完之后出现的。是因为在打印完之前Thread.sleep(10);}   CPU还有不到10ms的休息时间,等打印完成之后,tick不再>0, 因此就连几ms的休息时间也没有啦。 因为死循环的存在,4个线程一直在不停歇的耗费CPU资源,没有休息时间。因此CPU基本上会100%占用,好点的双核或者四核机器还好,差点的机器就会出现问题啦。

用了synchronized后 几个线程都正常,其实也只是一种假象,打印完之后4个线程依然存在,只是因为锁的存在而情况好一点。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马