EverL

既然读的是共享产量,打印的是局部变量count,那么不至于三个线程打印的局部变量都是100吧??

2019-09-14
8
1
回复 8
李一鸣 回复 EverL

由于对共享资源--剩余抄写次数没有做同步控制,所以导致多个线程读取到同样的值。例如剩余次数为90,更新前被三个线程读取到。于是这次抄写任务被三个线程各执行了一次,然后三个线程均更新剩余次数为89。也就是说在剩余90次这次抄写上,被执行了三次。由于run 方法逻辑简单,所以三个线程每次都是同时读取同时更新,造成每个线程都抄写了100次。如果在每个线程start之前sleep几毫秒,可以看到3个线程抄写的次数不会全是100次。

2019-09-16
向远之航 回复 李一鸣

老师的意思是这里的线程没有经过synchronized上锁,所以一开始被三个线程都抢到,所有三个线程都同时工作,因而都打印了100遍是吗?

2019-10-23
夜Y 回复 李一鸣

假如加锁了的话,那意义何在呢?另外一个人想要抄单词前,需要别人不在抄单词,这样写的话没有起到同步工作的作用吧= =

2019-10-29
海天s 回复 夜Y

是的,不用加锁。加锁就要等待了。

2019-11-05
任瑞斌 回复 EverL

试了几次,也没有看到三个都是100次的情况,只有加锁的时候才是100次

2019-11-07
李一鸣 回复 向远之航

是的,相当于三个同学同时看到还需要抄写90次,然后每个人都抄写了一边,然后每个人又分别更新了一次剩余次数为89.

2019-11-24
李一鸣 回复 夜Y

实际开发中,我们把程序逻辑抽象为3个步骤 1、取得任务 2、更新剩余任务次数 3、执行任务逻辑 我们可以对1和2上锁,最复杂的执行任务逻辑不需要上锁,这样多线程的优势就能够发挥出来了。

2019-11-24
李一鸣 回复 任瑞斌

都是100有一定的概率,也可能很难出现,这和电脑的性能有关系。不过只要三个人抄写次数加起来超过100,就说明程序的并发出了问题。

2019-11-24
没有更多内容
取消 回复 发送