由于对共享资源--剩余抄写次数没有做同步控制,所以导致多个线程读取到同样的值。例如剩余次数为90,更新前被三个线程读取到。于是这次抄写任务被三个线程各执行了一次,然后三个线程均更新剩余次数为89。也就是说在剩余90次这次抄写上,被执行了三次。由于run 方法逻辑简单,所以三个线程每次都是同时读取同时更新,造成每个线程都抄写了100次。如果在每个线程start之前sleep几毫秒,可以看到3个线程抄写的次数不会全是100次。
老师的意思是这里的线程没有经过synchronized上锁,所以一开始被三个线程都抢到,所有三个线程都同时工作,因而都打印了100遍是吗?
假如加锁了的话,那意义何在呢?另外一个人想要抄单词前,需要别人不在抄单词,这样写的话没有起到同步工作的作用吧= =
是的,不用加锁。加锁就要等待了。
试了几次,也没有看到三个都是100次的情况,只有加锁的时候才是100次
是的,相当于三个同学同时看到还需要抄写90次,然后每个人都抄写了一边,然后每个人又分别更新了一次剩余次数为89.
实际开发中,我们把程序逻辑抽象为3个步骤 1、取得任务 2、更新剩余任务次数 3、执行任务逻辑 我们可以对1和2上锁,最复杂的执行任务逻辑不需要上锁,这样多线程的优势就能够发挥出来了。
都是100有一定的概率,也可能很难出现,这和电脑的性能有关系。不过只要三个人抄写次数加起来超过100,就说明程序的并发出了问题。
既然读的是共享产量,打印的是局部变量count,那么不至于三个线程打印的局部变量都是100吧??