慕瓜7073846
2018-04-18 22:11
当from里能量少于amount时候,返回return。为什么这里就会产生争用条件呢?为什么只要让这里开始wait
这里存在一个概念性问题:工作内存 和 主内存
线程操作数据时:会将主内存中的数值read ->load 到工作内存中
线程操作完成后:工作内存中的数据 store ->write 到主内存中
这里画了一个图解释一下:
线程1获取到资源后进行一系列的操作(获取到a ,并进行修改为5500,还未来得及再次写去主内存中),在某一时刻线程进入了阻塞状态;
此时线程2隆重登场 :线程而进行了全套操作(获取到a ,并进行修改为5900,再存入主内存中),此时资源a被释放,线程1继续操作,将5500写入主内存中,
全程a的变化为 :5000->5900->5500也就是最终值为5500,而在线程2操作时有一个数组数值减少了900,线程1操作时有一个数组数值减少了500,这里a只多了500,所以就造成不守恒了。(因为操作哪一个数是随机的,这里操作目标数值是同一个 a )。
当返回return后,EnergySystemTest中的一个循环结束,这个循环后面的代码也不会去执行,而新的一个循环开始时就有可能争用数据a ,这里造成了争用产生。
使用wait 后,当线程1操作被中断后进入wait set集合等待,只有线程完全执行完以后,调用notify方法,此时才能唤醒线程继续往下执行。
注意两个方法区别:return 会让两个线程只有一次最终结果的输出;wait可以有两次输出。
深入浅出Java多线程
186088 学习 · 464 问题
相似问题