慕斯卡4106679
2015-12-02 19:41
这里加了sleep后,结果多次不是500,sleep在这里起到什么作用呢
线程是抢占式执行的,sleep意味着当前线程在一段时间内不执行操作,可是该线程的工作内存中已经得到了number,没有改变number的值意味着主内存中的值也没有改变,在sleep这段时间内其他线程又得到主内存中的number,这个number与sleep中的number可能一样(要是没有其它线程),这样的话这2个线程在最终执行完之后等于number++只执行一次
休眠时间内可能有其他线程读取了number的值,但是number还没有被修改,所以number值变小了
关于为什么不是500的次数变多了,一下是依据我对sleep()的理解产生的想法:
先说一下sleep():sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复。注意这里的恢复并不是恢复到执行的状态,而是恢复到等待池中等待CPU的宠幸。
下面开始解释为什么反而变多了:当你没有休眠0.1S的时候,线程们依次执行,就算有竞争也不会很激烈(因为部分线程执行完了就死掉了)。但是!答主让每个线程都休眠0.1S之后,这个时间让 更多的线程(我不敢保证是所有线程)累积到等待池中了,0.1S之后就是百家争鸣,竞争者的数量达到空前的高。冲突也就高,所以很容易让结果出错。
你根本的问题在于没有理解线程获得时间片的机制,也没有理解线程争用的概念。所以你提了一连串的问题。建议你把这门课前面的深入浅出Java多线程再看几遍。光讲速度不讲质量有什么用?
该方法是睡眠的意思,就是说 调用该方法的线程睡眠指定时间值的功能,指定时间值就是那个100的参数,也就是0.1秒,就是自动放弃CPU的执行权,等0.1秒后,才有获取CPU执行权的资格。
细说Java多线程之内存可见性
55910 学习 · 74 问题
相似问题