什么是有序性?
即程序执行的顺序按照代码的先后顺序执行。
编译器和处理器为了提高执行的效率性能,会对执行进行重排序,指令重排序对单线程应用没有影响,但是在多线程环境下可能会出现问题。
有序性问题
线程A
context = loadContext();
inited = true;
线程B
while(!inited ){
sleep
}
doSomethingwithconfig(context);
假设线程A发生重排序:
inited = true;
context = loadContext();
在这种情况下,B线程可能会拿到没有初始化的变量context。
有序性的技术保障
1、synchronized
2、lock
3、volatile(一定程度的有序性)
synchronized和lock在同一时刻只能让一个线程执行同步方法,当然就是有序的了。
volatile的有序性是指写入修改后的volatile变量这个操作必定优先于 读取这个变量。