为了账号安全,请及时绑定邮箱和手机立即绑定

sleep作用

这里加了sleep后,结果多次不是500,sleep在这里起到什么作用呢

正在回答

5 回答

线程是抢占式执行的,sleep意味着当前线程在一段时间内不执行操作,可是该线程的工作内存中已经得到了number,没有改变number的值意味着主内存中的值也没有改变,在sleep这段时间内其他线程又得到主内存中的number,这个number与sleep中的number可能一样(要是没有其它线程),这样的话这2个线程在最终执行完之后等于number++只执行一次

0 回复 有任何疑惑可以回复我~

休眠时间内可能有其他线程读取了number的值,但是number还没有被修改,所以number值变小了

0 回复 有任何疑惑可以回复我~

关于为什么不是500的次数变多了,一下是依据我对sleep()的理解产生的想法:

先说一下sleep():sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复。注意这里的恢复并不是恢复到执行的状态,而是恢复到等待池中等待CPU的宠幸。

下面开始解释为什么反而变多了:当你没有休眠0.1S的时候,线程们依次执行,就算有竞争也不会很激烈(因为部分线程执行完了就死掉了)。但是!答主让每个线程都休眠0.1S之后,这个时间让  更多的线程(我不敢保证是所有线程)累积到等待池中了,0.1S之后就是百家争鸣,竞争者的数量达到空前的高。冲突也就高,所以很容易让结果出错。

0 回复 有任何疑惑可以回复我~

你根本的问题在于没有理解线程获得时间片的机制,也没有理解线程争用的概念。所以你提了一连串的问题。建议你把这门课前面的深入浅出Java多线程再看几遍。光讲速度不讲质量有什么用?

0 回复 有任何疑惑可以回复我~

   该方法是睡眠的意思,就是说  调用该方法的线程睡眠指定时间值的功能,指定时间值就是那个100的参数,也就是0.1秒,就是自动放弃CPU的执行权,等0.1秒后,才有获取CPU执行权的资格。

0 回复 有任何疑惑可以回复我~
#1

慕斯卡4106679 提问者

这个我知道,但是为什么加了后,少于500的次数会增加?这个是为什么?
2015-12-02 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信