黑马程序员技术交流社区

标题: 同步代码块中的sleep? [打印本页]

作者: 王红霞    时间: 2012-7-16 21:39
标题: 同步代码块中的sleep?
本帖最后由 王红霞 于 2012-7-18 12:20 编辑

class Ticket implements Ruunable
{
        private int tick=100;
        Object obj=new Object();
        public void run()
        {
                while(ture)
                {
                   synchronized(obj)
                   {
                           if(tick>0)
                           {
                                   try(Thread.sleep(2);)catch(Exception e){}//既然线程是同步  为什么还要sleep?我觉得就算是有毕老师讲的例子的那种情况可是完全没必要加sleep啊?不用sleep不行吗?
                                   System.out.println(Thread.currentThread().getName()+".....sale:"+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();
        }
}



作者: 蒋映辉    时间: 2012-7-16 21:45
郁闷  评分那里还不要我输入完
   我开始也这么觉得的  后来做那个银行调度系统的时候就知道这个很重要了,比如,你要保证每个客户只能被调用一次  就要用同步代码块了吧,但是当你模拟用户处理过程的时候就要用sleep了  这样两个就在一起了
  当时还纠结了好久才把它同步好的
作者: 王红霞    时间: 2012-7-16 22:02
蒋映辉 发表于 2012-7-16 21:45
郁闷  评分那里还不要我输入完
   我开始也这么觉得的  后来做那个银行调度系统的时候就知道这个很重要了, ...

哦呵呵 银行系统我还没看到呢  现在看线程感觉sleep可以存在 就是没多大意义  那个视频我好好看看~~
作者: 王龙彪    时间: 2012-7-16 22:05
毕老师视频里加个sleep()是为了演示用的.
如果不加的话,你电脑里也会有其他的程序在获得cpu执行权后让那个synchronized进程暂停.
加上就看的更明显了
作者: 韩伟    时间: 2012-7-16 22:24
try(Thread.sleep(2);)catch(Exception e){}   这句代码说白了是为了出效果,正常情况下要出现这种错误必须要票数为1时,要求一个线程通过判断之后,并且在执行tick--之前被冻结。你也知道线程运行的速度多么的快,要符合上述的条件需要多么大的巧合啊。如果不把这种巧合显示出来让大家看,怎么能让大家明白这里存在的安全隐患呢。所以毕老师在这里加了这一句,相当于把把“一个线程通过判断之后,并且在执行tick--之前被冻结”条件定义为true。
作者: 周玉龙    时间: 2012-7-16 23:17
sleep的作用就是触发操作立刻重新进行一次cpu的竞争,简单来说就是停止当前线程的执行。经过我刚才的测试,发现如果不用sleep的话可能会被同一个线程占用所有的资源。如果用了sleep就可以保证不同线程竞争到资源,也就是说每个客户端都可以访问到资源。所有说这个在模拟实际用户操作过程中非常必要的。




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