8.Java内存模型和线程

来源:互联网 发布:天正建筑软件最新版 编辑:程序博客网 时间:2024/06/06 00:49

1. java内存模型

java虚拟机规范想定义一种java内存模型(jmm),来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让java程序在各种平台下都能达到一致的内存访问效果。
java内存模型主要定义了程序中各个变量的访问规则,即变量到内存的存入和读取。此处的变量不局部变量。因为局部变量是线程私有的,不会被共享。
Java内存模型规定了所有的变量都存储在主内存,每个线程都有自己的工作内存(可与高速缓存类比),线程工作内存中保存了该线程使用到的变量的内存副本。线程对变量的操作都在工作内存中完成。不同的线程之间无法直接访问其他工作内存中进行。线程之间的变量传递通过主内存俩完成。

线程、主内存、工作内存三者交互关系
这里写图片描述

2. 内存间交互

内存间的交互即一个比那狼如何从内存拷贝到工作空间,如何从工作空间同步回主内存等操作。
Java内存模型中定义了8种操作来完成。虚拟机实现时必须保证每一种操作都是原子的。
lock:用于主内存的变量,它把一个变量表示为一条线程独占的状态。
unlock:作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。
read:作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的load动作使用。
load:作用于工作内存的变量,它把read操作从主内存中的到的变量值放入工作内存的变量副本中。
use:作用于工作内存的变量,它把工作内存中一个变量的值传递给执行引擎,每当虚拟机遇到一个需求使用到变量的值得字节码指令时将会执行这个操作。
assign:作用于工作内存的变量,它把一个从执行引擎收到的值赋给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。
store:作用于工作内存的变量,它把工作内存中的一变量的值传送到主内存中,以便随后write操作使用。
write:作用于主内存的变量,它把store操作从工作内存中的得到的变量的值放入主内存的变量中。

8种操作的规则

(待填充)

3. volatile规则

volatile关键字用来修饰变量,是轻量级的同步机制。
当一个变量定义为volatile后,它将具备两种特性
1. 保证此变量对所有线程的可见性。即当一条线程修改了在这个变量的的值。新值对其他线程来说是立即可见的。但是普通变量不能做到这一点。
voatile只保证可见性,在以下两种情况下,仍需要加锁来保证原子性。
运算结果依赖变量的当前值,或者是多个线程同事修改值
变量需要于其他状态变量共同参与不变约束。
2. 禁止指令重排序优化
普通变量仅仅会保证结果的正确性,不能保证程序代码顺序于执行顺序的一致性,

4.对于long和double类型变量的特殊规则

()

5.原子性、可见性和有序性

Java内存模型处理并发是通过原子性、可见性和有序性来进行的。

5.1原子性

为了保证原子性,Java内存模型提供了lock和unlock操作,尽管这些操作为开放给用户直接使用,但是却提供了更高层次的字节码指令mointorerter和monitorxit来隐式的使用这两个操作,这两个字节码指令反应到Java代码中就是同步快-sychronized关键字。因此synchronized块内的操作具备原子性

5.2可见性

可见性是指当一个线程修改了共享变量的值,其他线程能够立即得知这个修改。Java内存模型是通过在变量修改后将新值同步回主内存,在读取变量钱从主内存刷新变量值这种依赖主内存作为传递的媒介的方式来实现可见性。volatile变量保证了新值能够立即同步到主内存,以及每次使用前立即从主内存刷新。而普通变量必能保证这一点。除了volatile,synchronized和final也可以实现可见性。同步块的可见性是因为:对一个变量执行unlock之前,必须把此变量同步回主内存(执行store、write操作)。final关键字是因为:被final修饰的字段在构造器中一旦完成初始化,并且构造器没有吧this的应用传递出去,那在其他线程中就能看见final字段的值。

5.3有序性

无序是指指令重排序和工作内存与主内存同步延迟的现象。
Java语言提供volat和synchronized两个关键字来保证线程之间操作的有序性。volatile关键字本身就包含了禁止指令重排序的语意。sychronized则是由“一个变量同一时刻只能允许一个线程对其进行lock操作”

6.现行发生原则

定义:先行发生时Java内存模型中定义的两项操作之间的偏序关系,如果操作A先行发生于操作B,那么在发生操作B之前,操作A产生的影响能被B观察到。影响包括修改内存中共享变量的值、发送消息、调用方法等。

原创粉丝点击