volatile 关键字修饰的go放到例子中我觉得有点不明所以

来源:8-7 notify和notifyall的区别

慕仙0921264

2019-01-21

我觉得例子中应该把有关go的循环去掉,Thread4调用notify(),会随机从等待池中选择一个线程进入锁池去竞争test对象锁,结果就是只有一个线程执行完成了,而剩余的两个线程还在等待池中,并不会主动去竞争test对象锁。Thread4调用notifyAll(),会将所有在等待池中线程放入到锁池中,之后锁池的所有线程都会去竞争test对象锁,最终三个线程都会执行完成。使用volatile关键字修饰的go是否有些多余?只是心里有点疑惑,希望老师指导一下。

写回答

1回答

翔仔

2019-01-21

同学好,用go是为了模拟多个线程等待一个信号去执行,不使用volatile的话,有可能出现虽然线程A将go改成了true,但是别的线程依然看到go是false的,也可能出现相反的情况,这个时候可能会出现很多莫名其妙的结果。当然,这个例子里不用go,先让所有进程等待,然后通过notify或者notifyall去唤醒再对比异同是ok的

用volatile是为后续讲解volatile留个眼熟,也能模拟现实中等待某个信号量执行操作的场景:)

0
0

剑指Java面试-Offer直通车 百度资深面试官授课

招聘季即将到来,让百度资深面试官来为你的高薪Offer保驾护航

8427 学习 · 1870 问题

查看课程