黑马程序员技术交流社区
标题:
同步代码块中的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