Java可见性之内存模型

来源:互联网 发布:js数组字符串方法 编辑:程序博客网 时间:2024/05/29 13:01

Java内存模型概述

Java内存模型(Java Memory Model)描述了Java线程中各种共享变量的访问规则,以及在JVM中将共享变量写入内存和从内存中读出共享变量的底层细节。
在一般的Java程序中,都有一个主内存,这个主内存中存放了所有的共享变量。而在每个线程中,又拥有属于自己的独立的工作内存。这个工作内存了保留了该线程使用的公共变量的一份copy。如下图所示:

这里写图片描述

在JMM中有两条规定:
1.线程只能修改自己工作内存中的共享变量副本,而不能直接从主内存中读写
2.线程无法访问其他线程中共享变量副本的值
从这两条规定中我们可以得出一个结论:一个线程要影响到另一个工作内存中的值,只能通过主内存中共享变量的真身来间接实现。

支撑Java内存模型的基础原理

指令重排序

在执行程序时,为了提高性能,编译器和处理器会对指令做重排序。重排序分为:
1.编译器优化重排序:编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。
2.指令级并行的重排序:如果不存l在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。
3.内存系统的重排序:处理器使用缓存和读写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。

数据依赖性
如果两个操作访问同一个变量,其中一个为写操作,此时这两个操作之间存在数据依赖性。
编译器和处理器不会改变存在数据依赖性关系的两个操作的执行顺序,即不会重排序。

as-if-serial
不管怎么重排序,单线程下的执行结果不能被改变。

0 0
原创粉丝点击