Java内存模型是定义线程共享的变量的访问规则(实例字段、静态字段和构成数组对象的元素),但不包括线程私有的局部变量和方法参数。

1.主内存与工作内存

Java内存模型规定,所有的变量都必须存储在主内存中。

线程使用到的变量保存在线程工作内存中,其实主内存的副本拷贝。

2. 内存间的交互操作

  • lock : 作用于主内存中的变量,将变量标识为线程独占的。
  • unlock :作用于主内存中的变量,将线程独占的变量解锁。
  • read :作用于主内存中的变量,将一个变量值从主内存传输到工作内存。
  • load :作用于工作内存的变量,将read读入的值放入工作内存的变量副本中。
  • use :作用于工作内存的变量,使用该变量。
  • assign :作用于工作内存的变量,为变量赋值。
  • store :作用于工作内存的变量,把工作内存的值传递给主内存。
  • write :作用于主内存的变量,把store的值放入主内存变量中。

3. 对于volatile型变量的特殊规则

3.1 volatile关键字的作用

  1. 保证此变量对所有线程的可见性。(当一条线程修改了变量值,其他线程是立即得知的,但不代表是线程安全的)
  2. 禁止指令重排序优化。

3.2 对于long和double型变量的特殊规则(不重要)

  long和double的非原子协定。

4. 原子性、可见性和有序性

4.1原子性

  Java内存模型直接保证基本数据类型的访问时具有原子性的。使用synchronized代码块保证更大范围内的原子性。

4.2 可见性

  volatile可以保证可见性。此外,synchronized和final也可以保证可见性。

4.3 有序性

  使用synchronized以及volatile保证有序性。

5. Java与线程

5.1 线程的实现

  1. 使用内核线程实现
  2. 使用用户线程实现
  3. 使用用户线程加轻量级进程混合实现

5.2 Java线程调度

  • 协同式调度
  • 抢占式调度

5.3 Java线程的状态

  1. 新建——创建后尚未启动的线程
  2. 运行——有可能正在执行,也有可能正在等待CPU为它分配时间
  3. 无限期等待——不会被分配时间,必须等待其他线程将其唤醒。
  4. 限期等待——一定时间后,被系统自动唤醒。
  5. 阻塞——等待进入同步区域,或者说等待一个排它锁。
  6. 结束——已经终止的线程。

深入理解JAVA虚拟机阅读笔记5——Java内存模型与线程的更多相关文章

  1. 深入理解JAVA虚拟机阅读笔记1——JAVA内存区域

    一.Java内存区域 1.程序计数器 线程私有. 当前线程所执行的字节码的行号指示器.由于JAVA是多线程的,因此每个线程都独立的程序计数器. 异常:没有规定任何OutOfMemeryError情况的 ...

  2. 深入理解java虚拟机阅读笔记(1)运行时数据区域

    java虚拟机所管理的内存区域主要分为方法区.堆:虚拟机栈.本地方法栈.程序计数器,如图: 1.程序计数器是当前线程所执行的字节码行号指示器,用以记录当前指令执行的位置.程序计数器是线程私有的,每个线 ...

  3. 深入理解Java 虚拟机阅读笔记(一)

    1.程序计数器- 占用空间:较小 作用:字节码行号指示器 作用详情:指示指令执行,如(字节码的执行,分支,循环,跳转,异常处理,线程恢复) 特点:线程私有(每个计数器独立计算,上下文相互独立). 2. ...

  4. 深入理解Java虚拟机--阅读笔记二

    垃圾收集器与内存分配策略 一.判断对象是否已死 1.垃圾收集器在对堆进行回收前,要先判断对象是否已死.而判断的算法有引用计数算法和可达性分析算法: 2.引用计数算法是给对象添加引用计数器,有地方引用就 ...

  5. 深入理解Java虚拟机--阅读笔记一

    Java内存区域 一.java运行时数据区域 1. 程序计数器:程序计数器占据的内存空间较小,是当前运行线程执行的字节码的计数:分支.循环.跳转.异常处理.线程恢复等都要依赖技术器来对执行的字节码进行 ...

  6. 深入理解JAVA虚拟机阅读笔记4——虚拟机类加载机制

    虚拟机把描述类的Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 在Java语言中,类型的加载.连接和初始化过程都是 ...

  7. Java虚拟机之JVM系统和内存模型

    1.类加载子系统 负责从文件系统或者网络中加载Class信息,加载的信息存放在一块称之为方法区的内存空间里. 2.方法区 存放类信息.常量信息.常量池信息.包括字符串字面量和数字常量等,方法区的大小决 ...

  8. 深入理解JAVA虚拟机阅读笔记6——线程安全与锁优化

    线程安全:如果一个对象可以安全的被多个线程同时使用,那它就是线程安全的. 一.Java中的线程安全 1.不可变 不可变的对象一定是线程安全的.String.枚举类型.java.lang.Number的 ...

  9. 深入理解JAVA虚拟机阅读笔记3——垃圾回收器

    一.垃圾收集器总览 新生代:Serial. ParNew. Parallel Scavenge 老年代:CMS.Serial Old. Parallel Old 最新的:G1 并行和并发的区别: 并行 ...

随机推荐

  1. linux 问题收集

    1,错误信息:bunzip2: command not found 解决方法:yum install -y bzip2 2,The X11 forwarding request was rejecte ...

  2. .net 分布式学习计划

    一: 1:.net分布式系统架构的思路     https://blog.csdn.net/slowlifes/article/details/53162014 2: nginx+iis实现负载均衡 ...

  3. Micro:bit篮球小游戏

    尝试用Micro:bit制作一款篮球游戏,材料是利用一些纸箱跟生活周遭可以取得的加上Micro;bit,打造出一个好玩的篮球游戏,制作过程也十分简单. 材料清单 先制作篮板. 接着制作篮球架体. 制作 ...

  4. Python对中文的支持

    在Python中,经常会出现中文,出现中文有时候会报错,这时候很多新手在处理中文编码的时候会有点不知所措. Python主要有2.x和3.x版本两个区别,在3.x版本中,已经支持中文直接开发,而不需要 ...

  5. Jmeter介绍1

    要测试的响应字段: 响应文本:即响应的数据,比如json等文本 响应代码:http的响应代码,比如200,302,404这些 响应信息:http响应代码对应的响应信息,列如OK,Found Respo ...

  6. Linux入门基础(二):Linux磁盘及文件管理系统

    磁盘管理 fdisk分区工具 只支持MBR分区 fdisk命令只有root用户能用 fdisk -l 列出所有安装磁盘及分区信息 fdisk /dev/sda (操作磁盘,按m可列出帮助界面,常用的操 ...

  7. Linux 安装JDK Tomcat MySQL(使用Mac远程访问)

    阅读本文需要一定的Linux基础 一 环境 阿里云服务器: CentOS 7.4 64位(基于RedHat) 本机: macOS High Sierra 二 压缩包 JDK http://www.or ...

  8. Myeclipse提高运行速度的方法

    下文是在其他博客拷过来的,借鉴借鉴,留个笔记,哈哈 1.老是弹出Quick update error .关闭myeclipse的Quick Update自动更新功能这个问题的解决办法是关闭自动更新Wi ...

  9. XSS-DVWA

    1.反射型 LOW: 没有过滤,直接键入PAYLOAD 查看源码 这里没有任何过滤,使用htmlspecialchars()过滤 结果不弹窗 MEDIUM: LOW等级的方法不奏效了 观察输出可能是过 ...

  10. mybatis学习----------查询数据库返回结果为空

    用mybits查询数据库时,如果参数已传入sql,sql也已经执行了,但是返回结果为空,首先保证数据库中有对应数据,如果有对应数据仍返回null,是数据库配置文件有问题.解决方案如下:1.mapper ...