JAVA内存模型概念

说到并发问题中的“可见性”就不得不要提及JAVA内存模型这一抽象概念;简单说,JAVA内存模型就是JAVA对编译器和处理器在对程序进行优化的时候做出的一系列的规范(禁止),已达到多线程时程序执行的安全或者正确性的效果。所以此处我们可以把JAVA内存模型这一抽象的概念理解为“规程”

JAVA内存模型的通俗表现

既然我们把JAVA内存模型定义为了一系列的“规程”,那么这些“规程”具体体现是什么?其实就是我们常说的“happens-before”,对于"happens-before"就是一系列的规则或者说是JAVA内存模型具体的实现对程序员的“承诺”。比如:
1)程序顺序规则:一个线程中的每个操作,happens-before于该线程中的任意后续操作
2)监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的加锁
3)voliate变量规则:对一个voliate变量的写,happens-before于任意后续对这个voliate变量的读
4)传递性:如果A happens-before B ,B happens-before C,那么 A happens-before C
5)start()规则:如果线程A执行操作ThreadB.start(),那么A线程的ThreadB.start()操作 happens-before于线程B的任意操作
6)join()规则:如果线程A执行ThreadB.join()并成功返回,那么线程B的任意操作happens-before与线程A从ThreadB.join()操作中成功返回
7)线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生
8)对象终结规则:一个对象的初始化完成先行发生于他的finalize()方法的开始
这里的八条规则就是JAVA内存模型定义的一系列的规程。可以这样理解,JAVA内存模型(JMM)对程序员做出的保证,只要你们的源程序是按这些规则写的,那么在多线程条件下你的程序就是安全的。
下面我对这八条“规程”进行一个细说:
1)程序顺序规则:不对具有“数据依赖”的语句进行重排,虽然只有这么一层意思但已经足够保证单线程下程序的安全,因为由于是单线程,所以本身就天生具备了原子性和立即可见性,在加上之前对具有“数据依赖语句”不重排就可以很好的保证了安全和效率。
2)监视器锁规则:这很好理解,就是一个线程要获取一个锁必须等待另一个线程释放了锁才能获得,这也是锁机制为什么能保证只有一个线程能享用共享资源的原因
3)voliate变量规则:其实这条规则,我个人理解是voliate的内存语义,就是voliate具有内存可见性的表面说法
4)传递性:就是可以具备推导性
5)start()规则:就是线程要先开启,才能执行任务
6)join()规则:就是join方法的意思,等待另外一个线程执行完后,当前线程才能继续执行
7)线程中断规则:线程要先终断才能知晓其中断状态
写到这里,其实我们发现,这些happens-before规则好像都是和我们平时知晓的常识一样,没有什么特别的地方,其实这才是happens-before的本来意思,就是要好懂,就是要容易理解,而这些happens-before规则就是JMM告诉程序员的,只要你们的代码是按这些规则来写的那么,你们的代码就没有安全问题,而至于这些规则背后的实现你们就不用管了,全部交给我JMM来执行。所以所happens-before是JMM的表现层

JAVA内存模型的功能

那么既然是“规程”,那么这些“规程”或者说是规则,能做什么?一句话,这一系列的“规程”都是为了实现多线程下的可见性,即保证多线程执行的安全性。

JAVA内存模型的底层原理

在这之前我还想说下“顺序内存一致性模型”它是一个理想的内存模型,它不会对程序进行优化即不会对指令进行重排,并且它还要求每个线程的操作必须是原子性和立即可见性的;因此该内存模型不会有“可见性”的问题;但JMM会对程序优化,并且它没要求线程的操作是原子和立即可见的,因此就会造成“可见性”所以为了解决“可见性”问题,JMM就要在多线程下要求程序必须同步只有这些我才能正确的保证多线程程序执行的语义。而同步的背后就是靠锁和voliate,而锁和voliate的背后原理则请看我的JAVA并发机制底层原理

述说JAVA内存模型相关推荐

  1. 2.什么是JAVA内存模型?

    为什么要设计JAVA内存模型? 小陈:老王,看了上一篇的<CPU多级缓存模型>,有个疑问为什么还要有JAVA内存模型啊? 老王:这么来说吧,CPU多级缓存模型,只是一个规范,但是底层基于这 ...

  2. 从底层吃透java内存模型(JMM)、volatile、CAS

    前言 随着计算机的飞速发展,cpu从单核到四核,八核.在2020年中国网民数预计将达到11亿人.这些数据都意味着,作为一名java程序员,必须要掌握多线程开发,谈及多线程,绕不开的是对JMM(Java ...

  3. 循序渐进:带你理解什么是Java内存模型

    近期笔者在阅读<深入理解Java虚拟机:JVM高级特性与最佳实现(第3版)>,书中提到关于Java内存模型的知识点,但是看完之后还是感觉有些模糊,便查阅一些其他相关资料.本文是笔者经过对知 ...

  4. java并发编程实战:第十六章----Java内存模型

    一.什么是内存模型,为什么要使用它 如果缺少同步,那么将会有许多因素使得线程无法立即甚至永远看到一个线程的操作结果 编译器把变量保存在本地寄存器而不是内存中 编译器中生成的指令顺序,可以与源代码中的顺 ...

  5. JSR 133 Java内存模型以及并发编程的最权威论文汇总

    Java内存模型 先看官方文档: https://docs.oracle.com/javase/specs/ JSR 133:Java TM内存模型和线程规范修订版:https://www.jcp.o ...

  6. java线程的优先级是数字越大优先级越高_《深入理解Java虚拟机》5分钟速成:12章(Java内存模型与线程)...

    第12章 Java内存模型与线程 前言: 1.物理机如何处理并发问题? 2.什么是Java内存模型? 3.原子性.可见性.有序性的具体含义和应用实现? 4.volatile 关键字特性? 5.基于vo ...

  7. Java内存模型与线程

    一.一致性 高速缓存的存储交互很好的解决了处理器与内存的速度矛盾,但也存在缓存一致性(cache coherence)问题 二.java内存模型 内存模型:对特定的内存或高速缓存进行读写访问的过程抽象 ...

  8. java内存模型-JMM

    java内存模型 转载于:https://www.cnblogs.com/our880tom/p/6679068.html

  9. 深入理解Java内存模型(四)——volatile

    2019独角兽企业重金招聘Python工程师标准>>> volatile的特性 当我们声明共享变量为volatile后,对这个变量的读/写将会很特别.理解volatile特性的一个好 ...

最新文章

  1. EEGNet: 神经网络应用于脑电信号
  2. Spark入门(一)单主standalone安装
  3. spring 长轮询_Spring集成文件轮询和测试
  4. 如何提升软件交付效能?答案未必如你所想
  5. [单刷APUE系列]第十一章——线程[1]
  6. js调用android手写输入法,手机进入页面,js调取软键盘
  7. 云小课 | 详解华为云独享型负载均衡如何计费
  8. 转:vSphere 7简介:混合云的功能和技术
  9. 下载并安装JDK7 教程
  10. 36个精美完整网站网页完整源码HTML+CSS+JS
  11. 搜索引擎优化主要对网站哪些方面做优化
  12. 推荐系统论文阅读:Entire Space Multi-Task Model
  13. 深度linux怎样设置显卡,在Deepin系统中安装英伟达NVIDIA显卡驱动的方法
  14. 暑期计算机数学培训心得体会,实用的暑期培训心得体会3篇
  15. android吃鸡闪退,绝地求生刺激战场iPhone6/6P闪退怎么办
  16. 单片机入门3.驱动蜂鸣器
  17. 还记得愤怒的小鸟嘛?今天用Python给大家安排一波!
  18. Centos6下Redis学习(一)——Java客户端Lettuce的使用、Springboot整合
  19. 大数据工程师岗位工作内容是什么
  20. 【SpringBoot】tk.mybatis集成,帮你更加傻瓜式的写代码~

热门文章

  1. 深入理解java虚拟机(5)---字节码执行引擎
  2. Mac配置iterm2 + oh-my-zsh + ys配色方案,并解决环境变量失效问题
  3. 机器学习2022笔记(一)—— 机器学习相关规定
  4. 论文笔记_SIGGRAPH2019会前课程:An Introduction to Physics-Based Animation_2
  5. 完全小白篇-用python爬取豆瓣电影影评
  6. python二级大题—1-12
  7. 人生修煉電影篇之-------------------- 《惊涛飓浪》
  8. DCIC-A城市巡游车与网约车运营特征对比分析-2-可视化
  9. EXCEL公式VLOOKUP函数用法详解
  10. 论文笔记-Towards Scene Understanding-Unsupervised Monocular Depth Estimation