您的位置:首页 > 编程语言 > Java开发

Java内存模型

2016-07-21 08:38 267 查看
Java内存模型
 

一.内存模型图

 


二.概述

       1.Java每个线程都保存对共享内存的一个拷贝,即工作内存。线程对共享数据的操作都必须在自己的工作内存中进行,              而不能直接操作共享内存中的数据。

       2.Java采用共享内存模型来实现数据的同步

三.内存模型的特性

       1.原子性:即一个操作不能被打断,必须一次执行完成。32位以内的基本数据类型的访问一般都是原子操作,都是64        为的long和double在32为JVM中却被分为2次操作,所以在多线程中是非线程安全的。

       2.可见性:一个线程对共享变量进行修改后其他线程能马上看到变化。对于volatile变量,JVM要求每次对其修改后必        须马上同步到共享内存中,而每次对volatile变量进行操作时必须到共享内存中刷新获取该变量。除了volatile可实现可       见性外,synchronized,lock,final也可以。对于synchronized,在同步快开始位置(monitor enter)就从共享内存读取变    量最新值,在同步快结束位置(monitorexit)就把变量值同步回共享内存。对于lock同样。对于final变量,当在定义时   
赋值或在构造函数中赋值时,会马上同步到共享内存。

       3.有序性:JVM为了执行效率,会把代码打乱,但如果从该线程的角度看,则其保证代码执行效果跟程序员写的时候逻    辑是一样的,但在其他线程则不一定,可能是乱序的。因为JVM进行了指令重排,Java提供了volatile和synchronized        来保证多线程间操作的有序性。volatile通过加入内存屏障来禁止指令重排,synchronized通过对一个变量进行加锁,在              同一时间只允许有一个线程对其进行加锁的规则来实现。

四.happens-before原则:

       1.对于操作A如果先行发生于操作B,那么操作A产生的影响(修改变量,发送消息,调用方法)能被操作B观察到。

       2.Java中除了天然的happens-before关系能保证一定是时间上先后执行的,其他的都需要进行同步来保证。Java中天然的    happens-before有:

              1.同一个线程视图里的代码流程。

              2.对一个变量的unlock后面对同一个锁的lock。

              3.对一个volatile变量的写操作先行发生于后面对这个变量的读取操作

              4.Thread对象的start()方法先与线程里的其他动作。

              5.线程中的所有操作都先行发生与其终止检测。

              6.对一个线程调用interrupt()方法先行发生与线程里检测到中断事件的发生。

              7.几个对象初始化的完成先与其finalize()方法的开始。

              8.操作A先与B,操作B先与C,则操作A先与C。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java 内存