为了账号安全,请及时绑定邮箱和手机立即绑定

到底什么是争用条件?为什么能量会不守恒

当from里能量少于amount时候,返回return。为什么这里就会产生争用条件呢?为什么只要让这里开始wait

正在回答

1 回答

这里存在一个概念性问题:工作内存 和  主内存

线程操作数据时:会将主内存中的数值read ->load 到工作内存中

线程操作完成后:工作内存中的数据 store ->write 到主内存中

https://img1.sycdn.imooc.com//5ad80b690001765507950508.jpg

这里画了一个图解释一下:

线程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可以有两次输出。


2 回复 有任何疑惑可以回复我~
#1

慕瓜7073846 提问者

非常感谢!
2018-04-19 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

到底什么是争用条件?为什么能量会不守恒

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信