int a = 1; int b = 2;int c = a + b;
将上面的代码编译成Java字节码或生成机器指令,可视为展开成了以下几步动作(实际可能会省略或添加某些步骤)。
以上这些动作对应指令,但是这些指令执行多主内存的时候却不一定是按照1-5的顺序来执行的,可能存在重排序
- 对a赋值1
- 对b赋值2
- 取a的值
- 取b的值
- 将取到两个值相加后存入c
在单个线程内,因为操作的都是这些变量的副本,所以在线程内表现为串行的语义
如果另外一个线程需要读取这些数据的时候,就可以发生2操作已经写入主内存而1操作却还没有写入主内存,就导致了感觉另外一个线程看该线程的是无序的.
指令重排
最新推荐文章于 2024-08-21 22:41:33 发布