有序性概念
Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性;
有序性的保证方式
- volatile可以保证一定的有序性;
- synchronized
- Lock
另外,Java具备一些先天的有序性,即happens-before原则;
happens-before原则
见《深入理解Java虚拟机》第2版P376;
关于volatile
- volatile能保证线程取到的值是最新值,但其对值的操作不是原子性的,即在其操作值的时候,别的线程可以取到值并进行操作;
- volatile适合做信号量,对共享变量的修改只发生在一个线程中;
- volatile修饰的变量禁止了指令重排,避免了因指令重排导致的在多线程之间出现的问题;