sleep作用

来源:4-2 volatile不能保证原子性(上)

慕斯卡4106679

2015-12-02 19:41

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

写回答 关注

5回答

  • qq_可口可乐_4
    2017-02-21 16:59:48

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

  • iceWang
    2016-11-16 12:42:08

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

  • 哀幻暝
    2016-07-21 10:58:22

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

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

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

  • sxian_wang
    2015-12-02 22:32:44

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

  • 南箫
    2015-12-02 19:52:20

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

    慕斯卡410...

    这个我知道,但是为什么加了后,少于500的次数会增加?这个是为什么?

    2015-12-02 19:59:14

    共 1 条回复 >

细说Java多线程之内存可见性

用两种方式实现内存可见性,代领大家深层次学习Java中的内存

55910 学习 · 74 问题

查看课程

相似问题