什么是JMM

JMM就是Java内存模型。目的是为了屏蔽系统和硬件的差异,让同一代码在不同平台下能够达到相同的访问结果。规定了线程和内存之间的关系。

内存划分

JMM规定了内存主要划分为主内存和工作内存。

如果Java线程都去操作主内存,对性能的影响就很大,如果每个线程都具有自己的工作内存,然后再将工作内存与主内存进行同步,就能提高性能。

这也会带来很多副作用,就是线程对内存的可见性问题,线程安全的问题。

JMM与JVM区别

不用Java虚拟机的内存区域划分,是两种逻辑的存在,是不同层次的划分结果。侧重点各有不同。主内存可以对应Java堆中的对象实例部分,工作内存可以对应栈中的部分。更低层次地来说,主内存对应硬件的物理内存,工作内存对应的是寄存器和高速缓存。

重排序

什么是重排序

重排序是编译器和处理器为了优化程序性能,对指令序列进行重新排序的行为。

重排序分类

  1. 编译器优化重排序:编译器在不改变单线程程序语义的前提下,对语句的执行顺序进行排序。
  2. 指令级并行重排序:采用指令级并行技术将多条指令重叠执行,如果不存在数据依赖性,则处理器可以改变指令的执行顺序。
  3. 内存系统的重排序:处理器使用缓存和读写缓冲器,为了提高内存的读写性能,指令数据进行排序。

1属于编译器重排序,2和3处于处理器重排序。

重排序的问题

  • 重排序可能会导致多线程程序出现内存可见性问题。编译器排序规则需要禁止特定类型的编译器重排序。处理器排序规则需要插入特定得内存屏障来禁止特定得处理器重排序。

数据依赖性

如果两个操作同时访问一个变量,而且这两个操作中有写,那么这两个操作就存在数据依赖性。

广义的说,如果改变了两个操作的顺序,就会出现不同的执行结果,那么就存在数据依赖。

对于有数据依赖的执行,不会发生重排序。

as-if-serial

as-if-serial语义的意思是:不管怎么重排序,单线程程序执行的结果不能被改变。处理器和编译器不会对存在数据依赖的执行进行重排序。

happens-before

在JMM中,如果一个操作的执行结果需要对另一个线程可见,那么这两个操作需要存在happens-before关系。可以是一个线程内的,也可以多线程。

happens-before 规则

  • 程序顺序规则:一个线程中的每一个操作,执行顺序与程序的的书写书顺序一致。
  • 管程锁定规则:一个解锁操作一定发生于下一次加锁之前。所以,synchronized同步的时候,所内的执行代码对后续同步该锁的线程是完全可见的。
  • volatile变量规则:对于一个volatile变量的写,先行发生在后续对这个变量的读。
  • 传递性:如果A操作先于B,B操作先于C,则A先于C。
  • 线程启动规则:Thread对象的start方法先行发生于这个线程的后续动作。
  • 线程中止规则:Thread对象的中止检测(如:Thread.join(),Thread.isAlive()等)操作,必行晚于线程中所有操作。
  • 线程中断规则:对线程的interruption()调用,先于被调用的线程检测中断事件(Thread.interrupted())的发生。
  • 对象中止规则:一个对象的初始化方法先于一个方法执行Finalizer()方法

两个操作具有happens-before关系不是要求这个两个对象的执行顺序,而是仅仅要求前一个操作的执行结果对后一个操作可见。

Java并发编程的艺术(四)——JMM、重排序、happens-before的更多相关文章

  1. Java并发编程的艺术(四)——线程的状态

    线程的状态 初始态:NEW 创建一个Thread对象,但还未调用start()启动线程时,线程处于初始态. 运行态:RUNNABLE 在Java中,运行态包括就绪态 和 运行态. 就绪态 该状态下的线 ...

  2. 读书笔记之《Java 并发编程的艺术》

    一.多线程语义 即使是单核处理器也支持多线程执行代码,CPU 通过给每个线程分配 CPU 时间片来执行任务,当前任务执行一个时间片后会切换到下一个任务,所以 CPU 通过不停的切换线程执行. 并发执行 ...

  3. 读《Java并发编程的艺术》(一)

    离开博客园很久了,自从找到工作,到现在基本没有再写过博客了.在大学培养起来的写博客的习惯在慢慢的消失殆尽,感觉汗颜.所以现在要开始重新培养起这个习惯,定期写博客不仅是对自己学习知识的一种沉淀,更是在督 ...

  4. 《Java并发编程的艺术》留给自己以后看的笔记

    <Java并发编程的艺术>这本书特别好,和<深入了解JAVA虚拟机>有一拼,建议做java的都看看,下面全部都是复制书中的部分内容,主要目的是做个笔记,方便以后遇到问题能找到. ...

  5. 《Java并发编程的艺术》读书笔记:二、Java并发机制的底层实现原理

    二.Java并发机制底层实现原理 这里是我的<Java并发编程的艺术>读书笔记的第二篇,对前文有兴趣的朋友可以去这里看第一篇:一.并发编程的目的与挑战 有兴趣讨论的朋友可以给我留言! 1. ...

  6. Java并发编程的艺术读书笔记(2)-并发编程模型

    title: Java并发编程的艺术读书笔记(2)-并发编程模型 date: 2017-05-05 23:37:20 tags: ['多线程','并发'] categories: 读书笔记 --- 1 ...

  7. Java并发编程的艺术(三)——volatile

    1. 并发编程的两个关键问题 并发是让多个线程同时执行,若线程之间是独立的,那并发实现起来很简单,各自执行各自的就行:但往往多条线程之间需要共享数据,此时在并发编程过程中就不可避免要考虑两个问题:通信 ...

  8. Java并发编程的艺术,解读并发编程的优缺点

    并发编程的优缺点 使用并发的原因 多核的CPU的背景下,催生了并发编程的趋势,通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升. 在特殊的业务场景下先天的就适合于并发编程. 比如在 ...

  9. java并发编程笔记(四)——安全发布对象

    java并发编程笔记(四)--安全发布对象 发布对象 使一个对象能够被当前范围之外的代码所使用 对象逸出 一种错误的发布.当一个对象还没构造完成时,就使它被其他线程所见 不安全的发布对象 某一个类的构 ...

  10. Java并发编程的艺术读书笔记(1)-并发编程的挑战

    title: Java并发编程的艺术读书笔记(1)-并发编程的挑战 date: 2017-05-03 23:28:45 tags: ['多线程','并发'] categories: 读书笔记 --- ...

随机推荐

  1. Python可视化界面

    可视化界面程序,本来不想写,只在console台运行就好,但是后来很多小伙伴都有这样的需求: 需要从redis中删除某个key的value,然后需要跟key去查,有些小伙伴不会用redis,就产生如下 ...

  2. JLC PCB 嘉立创自动确认生产稿,不讲武德?耗子尾汁!!!

    首先,开局一张图,嘉立创又不做人的一天.嘉立创不讲武德,耗子尾汁!!! 之前下单,勾选了确定生产稿和不加客编,结果生产稿出来还是给我加了客编.那我出10元的意思何在?让我自己花3元看我花的10元有没有 ...

  3. 【C++】sort函数使用方法

    一.sort函数 1.sort函数包含在头文件为#include<algorithm>的c++标准库中,调用标准库里的排序方法可以实现对数据的排序,但是sort函数是如何实现的,我们不用考 ...

  4. Folx中与下载相关的参数如何设置

    Folx是一款简单易用,功能强大的MacOS专用下载管理工具.要使Folx下载/上传速度快,同时又不影响其他软件的上网使用,还能够有计划地安排下载,那么就必须对Folx进行参数设置.接下来小编详细讲解 ...

  5. SD卡被格式化了还能恢复吗

    SD卡轻便小巧,它的主要功能是拓展便携式设备.包括:数据相机.手机及其他的多媒体播放器等的存储空间,缓解设备本身的存储压力. 很多用户反应,SD卡使用了一定的时间后,会出现SD卡受损的提示,再次打开的 ...

  6. Guitar Pro吉他指弹入门——双手泛音

    曾经有一段时间在琴行里经常遇到有人来试琴,很多人试弹得曲子就是郑成河的<Flaming>,直译过来就是热情的意思.这首曲子里面有很多泛音存在,吉他泛音类似于钟鸣或者摇铃的声音,是一种令人耳 ...

  7. 苹果电脑不支持ntfs磁盘怎么办?用这一招轻松搞定!

    ntfs是一种Windows NT内核的系列操作系统所支持的磁盘格式.相较于fat文件格式,ntfs彻底解决存储容量限制,可支持16Exabytes(1018),同时,ntfs也拥有更强的稳定性及安全 ...

  8. FL studio系列教程(十七):FL Studio走带面板介绍

    FL Studio走带面板主要是用来控制播放.录音以及调整歌曲速度的,除此之外还可以用来选择样本剪辑.下面就来详细地看一下这部分菜单. 1.样本/歌曲模式 样本/歌曲模式主要是用来切换样本和歌曲两种模 ...

  9. 对JVM的一个基础了解

    1.JVM范围 2.JVM和class文件 (1).JVM和Java语言无关,JVM是一种规范,任何语言只要能编译成class文件格式都能在JVM上运行 3.class文件格式 (1).class文件 ...

  10. Elasticsearch 理解mapping中的store属性

    默认情况下,对字段值进行索引以使其可搜索,但不存储它们 (store). 这意味着可以查询该字段,但是无法检索原始字段值.在这里我们必须理解的一点是: 如果一个字段的mapping中含有store属性 ...