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留个眼熟,也能模拟现实中等待某个信号量执行操作的场景:)
00
相似问题
violate读和普通读
回答 1
关于volatie关键字的问题
回答 2