你输出这个能量总和精度这么高的吗。。。。可能是double有点跟不上你这个精度吧
条件不满足就不做转移,原先值还是原先值
这里存在一个概念性问题:工作内存 和 主内存
线程操作数据时:会将主内存中的数值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可以有两次输出。
第一个问题:并发时的时刻其实指的是某个很短的时间,当系统只有一个内核时,系统在某个时刻确实只能执行一个线程,大多数系统都用的是时间片轮换算法,就是多个进程在分配到的极短时间片轮流使用CPU,详情可以看看计算机操作系统这类书,都有具体介绍
第二个问题,按照我的理解是这样的,用这个举例吧
正确执行时:
线程1:c=5000,a=5000;a=a+500=5500;c=a
线程2: c=5500;c=c+900=6400,结果是6400
争用时:
线程1:c=5000,a=5000;a=a+500=5500;
线程2:c=5000;c=c+900=5900;
线程1:c=a,结果是5500
线程2与线程1争用资源,导致c损失900;
因为每条线程就是一个数组元素,能量的转换就是在数组元素间进行的传递,只是从一个数组元素转移到了另一个数组元素,而经过加锁机制之后,数组元素中不会有数据的丢失,故最后的总值还是原数组的所有数组元素的总和。
Debug调试的时候输出就是0到99的顺序,不用Debug调试直接运行就不是0到99输出。
大致可以理解为创建了所有的线程,再争用资源。
调试的时候有断点,产生了优先级,所以才按序输出的。
主线程循环开了100个线程,在主线程循环完之后,100个线程就开始争内存了,所以第2个线程不是1,而是100内随机一个
能否发一下完整代码,我按照你的描述测试完,总能量一直是不变的,转移的能量也是在同步代码当中进行,也真的加到了目标能量盒当中。不知道你的跳跃输出是由于什么,睡眠时间的问题还是代码的问题?
4-1中是没有synchronized和while循环的,这样的情况运行就会有损失
有点乱啊