原子性
有序性
可见性
Happens-Before原则
内存模型:主要目的是限制了主内存变量的访问规则,这里变量包括,静态字段,实力字段,构成数组的元素,但不包括局部变量和方法参数,因为他们是一个线程私有的,不存在并发问题。
如果要强行和java内存区域对应起来,就是 主要内存对应着 堆,工作内存(高速缓存区)对应着 方法栈中的部分区域。
在内存直接的交互,jvm内存模型定义了8大操作,且都是都是原子性的,lock,unlock,read,load,use,assign,store,wirte.
其中 ,read,load,use,assign,store,wirte 是用户可以使用的 ,而lock,unlock用户可以通过操作 更高级的指令monitor来实现。
在执行程序时为了提高性能,编译器和处理器常常会对指令做重排序。重排序分三种类型:
1. 编译器优化的重排序。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。
2. 指令级并行的重排序。现代处理器采用了指令级并行技术(Instruction-Level Parallelism, ILP)来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。
3. 内存系统的重排序。由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。
从java源代码到最终实际执行的指令序列,会分别经历下面三种重排序:
java编译器在生成指令序列的适当位置会插入内存屏障指令来禁止特定类型的处理器重排序