`
yangwn
  • 浏览: 75636 次
  • 性别: Icon_minigender_2
  • 来自: 大连
社区版块
存档分类
最新评论
  • icewubin: kimmking 写道icewubin 写道Dollyn 写道 ...
    Java
  • kimmking: icewubin 写道Dollyn 写道我十分怀疑最后一条,很 ...
    Java
  • beneo: 完全忽略了一個好的JVM的優化能力 難道java是C編譯器么 ...
    Java
  • icewubin: Dollyn 写道我十分怀疑最后一条,很多编译器都会自动做类似 ...
    Java
  • Dollyn: 我十分怀疑最后一条,很多编译器都会自动做类似优化吧(不知道JD ...
    Java

深入理解JMM的重点

    博客分类:
  • JAVA
阅读更多

JMM具体规定要JLS的 "Thread and lock"一章中,可以说这是一章非常晦涩的一个规范,要想完全把
它理解清楚,一般的辛苦是不行的.那是要"相当的~~~"的辛苦.而要把它向别人再解释清楚,那简直就
是恶梦.

作者自知无力能全面清楚地向大家说明这一章的内容,但以作者的经验,主要从以下两个方面去理解
可以改快地抓住本质.而不至于陷入"Thread and lock"的泥潭.

一.理解主存储区和线程工作存储区.二.理解同步的两个功能.

首先要明白的问题:
1.多个线程共有的字段应该用synchronized或volatile来保护.
2.synchronized负责线程间的互斥.即同一时候只有一个线程可以执行synchronized中的代码.
3.volatile负责线程中的变量与主存储区同步.但不负责每个线程之间的同步.

[Main Memory]与[Working Memory]
Main Memory是实例所在的存储区,所有实例和实例的字段都在此区域,为所有线程所共有.
Working Memory是绺个线程独自所拥有的存储区.其中有Main Memory中部分COPY.

这两个存储区只在JVM内部与物理存储区无关.


如何理解Main Memory 与Working Memory.

 设想两个棋手要通过两个终端显示器(Working Memory)对奕,而观众要通过服务器大屏幕(Main Memory )
观看他们的比赛过程.这两个棋手相当于是同步中的线程,观众相当于其它线程.

 棋手是无法直接操作服务器的大屏幕的.他只能看到自己的终端显示器,只能先从服务器上将当前
结果先COPY到自己的终端上,然后在自己的终端上操作.将操作的结果记录在终端上,然后在某一时刻同步到
服务器上.他所能看到的结果就是从服务器上COPY到自己的终端上的内容,而要想把自己操作后的结果让其他
人看到必须同步到服务器上才行.至于什么时候同步,那要看终端和服务器的通信机制.

为什么要规定这么复杂的规范?因为要预留JVM的优化空间,如果规定所有的计算结果必须同步到主存储区,
那么对于方法中的计算顺序,赋值顺序等就没有优化的可能了.
引用字段:
 线程在引用字段时不能直接从Main Memory中引用(JAVA1.2以前如此),如果Working Memory中没
有该字段,则会从Main Memory中将该字段COPY到Working Memory中,这个过程为read-load,完成后线程会
引用该COPY.
 当同一线程再度引用该字段时,有可能重新从Main Memory中获取COPY(read-load-use),也有可能
直接引用原来的COPY(use),也就是说 read,load,use顺序可以由JVM实现系统决定.

字段赋值:
 线程在字段赋值时不能直接为Main Memory中字段赋值(JAVA1.2以前如此),线程会将值指定给Working
Memory中的字段COPY(assign),完成后这个COPY会同步到主存储区(store-write),至于何时同步过去,根据JVM
实现系统决定.
有该字段,则会从Main Memory中将该字段COPY到Working Memory中,这个过程为read-load,完成后线程会
引用该COPY.
 当同一线程多次重复对字段赋值时,比如:
 for(int i=0;i<100;i++)
  filldX = .....;
线程有可能只对Working Memory中的COPY进行赋值,只到最后一次赋值后才同步到主存储区.
所以assign,store,weite顺序可以由JVM实现系统决定.


JLS规定了6 个action,为最小操作单位,它们是原子的(atomic),JLS规定了这6个操作必须的顺序,但这个规定
是一个粗范围的,具体实现的JVM可以在这个范围内精心设计按自己的方式排序来达到最优:
 [read和write] 完成将字段从Main Memory COPY到Working Memory 和从 Working Memory COPY到
        Main Memory.
 [use和assign] 指示线程需要从Main Memory引用字段 和 需要为Main Memory中字段赋值.
 [lock和unlock] 表示线程获取锁和释放锁.

[synchronized 两个功能]

synchronized 方法 与同步块.

所有synchronized方法 最终还是同步块.
非静态的synchronized 方法相当synchronized (this){方法内容}
静态的synchronized 方法相当synchronized (XXX.clsss){方法内容}

所以我们把synchronized方法合并为同步块.

当线程要进入synchronized时,Working Memory中所有没有同步到Main Memory结果会强制store-write,然后
Working Memory会被clear.那么只要再有对字段的引用当然会先read-load.

当线程要退出synchronized时,必须执行store-write,即把Working Memory中的结果同步到Working Memory中,但
退出synchronized后线程可以继续引用Working Memory中的COPY.

所以,线程在进入和退出synchronized时都把Mian Memory与Working Memory中的字段同步.
但在synchronized外和synchronized中,何时进行Mian Memory与Working Memory中的字段同步是不确定的.

大家已经非常明白这里说的"同步"是指Mian Memory与Working Memory中字段值的"一致".即内存同步,而不是指
synchronized本身的"互斥"的意思.

加上前面所介绍的 volatile,我们知道如果要完成Mian Memory与Working Memory中字段值的"一致",只有线程进入
或退出synchronized时,或字段是volatile时才能保证,其它的情况下,JAVA还没有方法保证.

随着JVM版本的更新,以及关于JMM的JSR版本更新,JMM的修改完善会使不同时期有不同的表现,但这些修改都是为了
修复完善JLS中的规范,JAVA是向前兼容的.前面的规范本身一般不会被修改.所以掌握上面这些重点知识后,可以再
详细研究JLS的"Thread and lock"和具体的JSR.

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/axman/archive/2006/08/19/1097541.aspx

分享到:
评论

相关推荐

    01-并发编程之深入理解JMM&并发三大特性(一).pdf

    并发编程之深入理解JMM&并发三大特性

    14、深入理解并发可见性、有序性、原子性与JMM内存模型

    深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发...

    深入理解JMM

    对JMM大致的介绍了一下,尤其是同步原语synchronized,volatile,final有一个很详细的介绍,可以学习学习

    【并发编程】深入理解JMM.pdf

    高级开发者:需要深入理解并发编程原理,解决复杂并发问题的资深开发者。 计算机科学学生:正在学习计算机科学,对并发和分布式系统感兴趣的学生。 系统架构师:负责设计和优化大型系统架构,需要了解并发编程以提高...

    深入Java内存模型-JMM

    深入Java内存模型-JMM。。。。。。。。。。。。。。。。。。

    14、深入理解并发可见性、有序性、原子性与JMM内存模型(1).pdf

    14、深入理解井发可见性、有序性、原子性与JMM内存模型 (1).pdf 15、CPU缓存架构详解&高性能内存队列Disruptor 实战 (1).pdf 16、常用并发设计模式精讲 (1).pdf designpattern.zip disruptor.zip forkjoin.zip jmm(1...

    深入理解 Java 内存模型

    深入理解 Java 内存模型,由程晓明编著,深入理解java内存模型JMM

    JMM&JSR;.rar

    Java程序是需要运行在Java虚拟机上面的,Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的...

    JMM内存模型图

    Java运行时内存模型图

    sgys108jmm1.apk

    sgys108jmm1.apk

    《深入理解JAVA内存模型》PDF

    Java线程之间的通信由Java内存模型(本文简称为JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main ...

    jmm(1).zip

    14、深入理解井发可见性、有序性、原子性与JMM内存模型 (1).pdf 15、CPU缓存架构详解&高性能内存队列Disruptor 实战 (1).pdf 16、常用并发设计模式精讲 (1).pdf designpattern.zip disruptor.zip forkjoin.zip jmm(1...

    手机java模拟器JMM3.0

    为智能手机安装java支持,使手机可以安装使用java应用程序如游戏等

    美国钻石JMM-512-V512技术手册(英文).rar

    美国钻石JMM-512-V512技术手册(英文)rar,美国钻石JMM-512-V512技术手册(英文)

    Java内存模型详解JMM.docx

    Java内存模型详解JMM.docx

    java内存模型jmm

    java内存模型jmm

    JMM

    JMM 具有样条基础的纵向和生存数据的联合模型从github安装: library(devtools)install_github("shanpengli/JMM", build_vignettes = FALSE, ref = "main")

    JVM的基础和调优【JMM 内存结构 GC OOM 性能调优 ThreadLocal】

    面试重点 JVM的基础和调优【JMM 内存结构 GC OOM 性能调优 ThreadLocal】 内存泄露:是指程序在申请内存后,无法释放已申请的内存空间就造成了内存泄露, 一次的内存泄露似乎不会有大的影响,但是内存泄露堆积的后果...

    深入理解Java内存模型.程晓明(带书签文字版).pdf

    基础 4 并发编程模型的分类 4 Java 内存模型的抽象 4 ... JMM,处理器内存模型与顺序一致性内存模型之间的关系 68 JMM 的设计 69 JMM 的内存可见性保证 72 JSR-133 对旧内存模型的修补 73 个人简介 74 参考文献 74

    5-3JMM-CPU缓存一致性协议MESI.mp4

    5-3JMM-CPU缓存一致性协议MESI.mp4

Global site tag (gtag.js) - Google Analytics