java内存模型

来源:互联网 发布:mac 清理系统垃圾 编辑:程序博客网 时间:2024/05/29 02:40

处理器(进行运算) ——》高速缓存(用于解决处理器的运算速度远高于内存的读写速度的问题,提前将要用到的变量放入缓存中) ——》主内存(存储数据);
每个处理器都有一个高速缓存,多个处理器同时对内存进行操作时就要遵行协议来对公用的内存进行读写了。java的内存模型可以理解成:在特定的操作协议下,对特定的内存或高速缓存进行读写访问的过程抽象。
为了压榨处理器的运算能力,除了增加高速缓存以外,处理器可能会对输入代码进行乱序执行优化。java虚拟机的即时编译器中也有类似的指令重排序优化。

java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量与java编程中的变量有区别,它包括了实例字段,静态字段和构成数组对象的元素,但不包括局部变量与方法参数,因为后者是私有的,不会被共享。

java内存模型规定,所有的变量都存储在主内存中,每个线程都有自己的工作内存(类似高速缓存),工作内存中保存了被该线程使用到的变量(所有的变量,包括volatile修饰的变量)的主内存副本拷贝,线程对变量的所有操作都必须的工作内存中进行。
**注意:1.volatie变量依然会有工作内存的拷贝,但是由于他特殊的操作顺序性规定(load和use连续出现,store和assign连续出现)看不出来而已,volati变量只能保证变量的可见性(就是变量一经修改其他的线程都能看到)
2.volatile变量禁止指令重排序优化**
主内存对应的是堆中的对象实例数据部分,工作内存则对应于虚拟机栈中的部分区域。更底层讲:主内存直接对应于物理硬件的内存,虚拟机可能会让工作内存优先存储于寄存器和高速缓冲中。

内存间交互操作
主内存与工作内存之间具体的交互协议分为八种操作
lock(锁定,对应synchronized指令)作用于主内存变量
unlock(解锁)作用于主内存加锁的变量。
read(读取)作用主内存变量,将住内存的变量放入工作内存中。
load(载入)作用于工作内存,将read操作从主内存中得到的变量值放入工作内存的变量副本中。
use(使用)将工作内存中一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用到变量值的字节码指令时将会执行这个操作
assign(赋值):作用于工作内存的变量,他把一个从执行引擎接收到的值赋给工作内存中的变量,同上。
store(存储):作用于工作内存的变量,将工作内存中的一个变量的值传送给主内存中。
write(写入):作用于主内存的变量,他把store操作从内存中得到的变量的值赋给主内存中的变量中。

volatile保证线程安全的两个条件:
1.运算结果并不依赖于变量的当前值,或者能够确保只有单一的线程修改变量的值。
2.变量不需要与其他的状态变量共同参与不变约束。

实现可见性的关键词有:volatile,synchronized和final。

原创粉丝点击