问答详情
源自:4-2 Java线程交互之能量损失之谜:争用条件

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

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

提问者:慕瓜7073846 2018-04-18 22:11

个回答

  • 泰勒伯顿
    2018-04-19 11:38:02
    已采纳

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

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

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

    https://img.mukewang.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可以有两次输出。