int a = 1;
int b = 2;
int c = 3;
这段代码我们可能认为它是按照顺序来赋值的,其实并不是
因为这三次赋值相互之间没有任何关系,于是Java中这段代码的执行顺序可能是乱序的,我们并不知道谁先执行,这种可能出现乱序的情况叫做重排序
如果代码是这样的
int a = 1;
int b = a;
int c = b;
这样后面的赋值需要依赖前面的赋值,所以就不会发生重排序
其实一次对象的赋值也有可能发生重排序,比如下列代码
List num = new ArrayList();
步骤 | 操作 |
---|---|
1 | 分配内存 |
2 | 初始化num |
3 | 指针指向这块内存 |
步骤123
由于重排序很有可能变成132
另外要说的一点volatile关键字的两个作用
- 使变量多线程可见
- 禁止重排序