JMM(Java内存模型)
概念:
JMM是抽象的概念,是一种规范。JMM规定内存分为主内存和工作内存,其中主内存用来存储所有变量,工作内存需要对变量进行操作时,需要将主内存中变量拷贝到线程自己的工作内存中,完成所需操作之后,再将数据写回主内存。
目的:
解决各线程的工作内存数据不一致、编译器优化和指令重排的问题。
有如下三个特性:
- 可见性
- 原子性
- 有序性
可见性:
当一个线程将数据写回主内存时,其他线程也更新自己工作内存中的数据,保证和主内存中的数据一致。即一个线程修改了数据,其他线程也看的见,这就是所谓的可见性。
原子性:
类似于事务中的原子性,要么全部执行成功,要么全部执行失败。
有序性:
在数据没有依赖性的时候,编译器会进行指令重排,有时候会导致结果不符合预期,为了得到正确的结果,这就要需要保证指令有序的执行。
拓展:
在 java 关键字中,volatile是一个轻量级的同步机制,保证了可见性和有序性,但是不保证原子性。而 synchronized 关键字是一把重型锁,会影响性能,但是它保证 JMM 规范中的可见性、原子性和有序性。
注意:
区分 JVM运行数据区、JMM(Java内存模型)和 Java 对象模型。