线程是操作系统的最小调度单位,也是执行单位,为了追求高性能,线程里面的指令执行顺序是不定的,这来自编译器会重排序指令,处理器会乱序或者并行的执行,编译器还有可能将数据放在处理器的寄存器中等,这些优化技术在单线程的程序中表现得很好,但是到了多线程程序中就有问题了。
首先要了解下Java的内存结构,然后我们再进入线程和内存的关系, Java的内存结构如下
如果多线程之间不共享数据,这也表现得很好,但是如果多线程之间要共享数据,那么这些乱序执行,数据在寄存器中这些行为将导致程序行为的不确定性,现在处理器已经是多核时代了,这些问题将会更加严重,每个线程都有自己的工作内存,多个线程共享主内存,如图
如果共享数据,什么时候同步到主内存让别人的线程读取数据呢?这又是不确定的,如果非要一致,那么代价高昂,这将牺牲处理器的性能,所以现在的处理器会牺牲存储一致性来换取性能,如果程序要确保共享数据的时候获得一致性,处理器通常了提供了一些关卡指令,这个可以帮助程序员来实现,但是各种处理器都不一样,如果要使程序能够跨平台是不可能的,怎么办?
使用Java,由JMM来屏蔽,我们只要和JMM的规定来使用一致性保证就搞定了,那么JMM又提供了什么保证呢?JMM的定义是通过动作的形式来描述的,所谓动作,包括变量的读和写,监视器加锁和释放锁,线程的启动和拼接,这就是传说中的happen before,要想A动作看到B动作的结果,B和A必须满足happen before关系,happen before法则如下:
1, 程序次序法则,如果A一定在B之前发生,则happen before,
2, 监视器法则,对一个监视器的解锁一定发生在后续对同一监视器加锁之前
3, Volatie变量法则:写volatile变量一定发生在后续对它的读之前
4, 线程启动法则:Thread.start一定发生在线程中的动作
5, 线程终结法则:线程中的任何动作一定发生在括号中的动作之前(其他线程检测到这个线程已经终止,从Thread.join调用成功返回,Thread.isAlive()返回false)
6, 中断法则:一个线程调用另一个线程的interrupt一定发生在另一线程发现中断。
7, 终结法则:一个对象的构造函数结束一定发生在对象的finalizer之前
8, 传递性:A发生在B之前,B发生在C之前,A一定发生在C之前。
- 大小: 28.3 KB
- 大小: 10.9 KB
分享到:
相关推荐
初步认识 Volatile、从硬件层面了解可见性的本质、JMM、HappenBefore;初步认识 Volatile、从硬件层面了解可见性的本质、JMM、HappenBefore;
Java程序是需要运行在Java虚拟机上面的,Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的...
sgys108jmm1.apk
并发编程之深入理解JMM&并发三大特性
Java运行时内存模型图
美国钻石JMM-512-V512技术手册(英文)rar,美国钻石JMM-512-V512技术手册(英文)
对JMM大致的介绍了一下,尤其是同步原语synchronized,volatile,final有一个很详细的介绍,可以学习学习
为智能手机安装java支持,使手机可以安装使用java应用程序如游戏等
深入Java内存模型-JMM。。。。。。。。。。。。。。。。。。
深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发...
Java内存模型详解JMM.docx
JVM的基础和调优【JMM 内存结构 GC OOM 性能调优 ThreadLocal】 内存泄露:是指程序在申请内存后,无法释放已申请的内存空间就造成了内存泄露, 一次的内存泄露似乎不会有大的影响,但是内存泄露堆积的后果就是内存...
java内存模型jmm
目录 并发编程领域的关键问题 1 现代计算机物理上的内存模型 2 Java内存模型(JMM) 2 JVM对Java内存模型的实现 3 Java内存模型带来的问题
JMM 具有样条基础的纵向和生存数据的联合模型从github安装: library(devtools)install_github("shanpengli/JMM", build_vignettes = FALSE, ref = "main")
主要介绍了java内存模型(JMM)及happens-before原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
5-3JMM-CPU缓存一致性协议MESI.mp4
一提到happens-before原则,就让人有点“丈二和尚摸不着头脑”。这个涵盖了整个JMM中可见性原则的规则,究竟如何理解,把我个人一些理解记录下来。下面可以和小编一起学习
gbspapp21208jmm.bin
最新的模拟器哦可以联网的并且支持几乎所有的JAR文件