JMM内存模型的特性
JMM规范下,三大特性:
- 可见性
- 原子性
- 有序性
可见性
是指当一个线程修改了一个共享变量的值,其他线程是否能够立即知道该变更,JMM规定了所有变量都存储在主内存中。
系统主内存的共享变量数据修改被写入的时机是不确定的,多线程并发下很可能出现“脏读”,所以每个线程都有自己的工作内存,线程自己的工作内存中保存了该线程使用到的变量的主内存的副本拷贝,线程对变量所有的操作(读取,赋值等)都需要线程自己在工作内存中进行,而不能直接读写主内存中的变量。不同线程之间无法直接访问对方的工作内存的变量,线程间的变量值的传递均需要通过主内存完成。
原子性
指的是一个操作是不可打断的,在多线程环境下,操作不能被其他线程干扰。
有序性
案例:
有序性:对于一个线程的执行代码而言,我们总是习惯性的认为代码的执行总是从上到下,有序执行。但是为了提升性能,编译器和处理器通常会对指令进行重新排序。Java规范规定了JVM线程内部维持顺序化语义,即只要程序的最终结果与顺序化执行结果一致,那么指令的执行顺序可以与代码顺序不一致,此过程叫指令的重排序。