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. bzoj 4689: Find the Outlier

    数据不大,枚举哪个式子错了,对剩下的d+2个式子随意选d+1个高斯消元,然后代入剩下的式子检查是否正确,正确就是那一个式子错了 #include<bits/stdc++.h> #defin ...

  2. Java虚拟机笔记(四):垃圾收集器

    前言 前一篇文章介绍了内存的垃圾收集算法,现在介绍下内存回收的具体实现--垃圾收集器. 由于Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商,不同版本的虚拟机所提供的垃圾收集 ...

  3. 异步任务(Celery)详解

    一.背景 在开发中,我们可能经常会遇到一些需要执行时间很长的任务,如果放在前端,会让用户一直卡在那儿等待或者一直转圈圈,体验非常不好.为了改善这种体验,我赶紧上网搜索,果然,前人早已有解决办法了.那就 ...

  4. 三剑客之sed&grep

    第1章 练习题 1.1 第1题 取得/etc/hosts 文件的权限 如何取得/etc/hosts 文件的权限对应的数字内容,如-rw-r--r--  为 644,要求使用命令取得644 这样的数字. ...

  5. Nopcommerce主要用到的技术及特点

    很多人都说通过阅读.学习大神们高质量的代码是提高自己技术能力最快的方式之一.我觉得通过阅读NopCommerce的源码,可以从中学习很多企业系统.软件开发的规范和一些新的技术.技巧,可以快速地提高我们 ...

  6. flask 实现异步非阻塞----gevent

    我们都知道,flask不支持异步非阻塞的请求,我们可以创建一个新项目去测试一下,推荐大家使用pycharm去开发我们的flask  使用特别的方便. rom flask import Flask im ...

  7. css布局笔记(二)Flex

    flex Flex是"Flexible Box"的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 任何一个容器都可指定为Flex布局. .box{di ...

  8. jmeter☞工作区介绍(三)

    基于jmeter4.0,jdk1.8 目录树:存放设计过程中使用的元件.执行过程中默认是从根节点开始顺序遍历元件.比如说HTTP请求的取样器就是元件,组件就是一个或多个元件的集合. 测试计划编辑区域: ...

  9. Eclipse Photon没有Server选项的问题

    安装Eclipse Photon版本的时候选择了Java开发,导致最后需要本地tomcat调试的时候找不到Server配置选项. ①在软件eclipse下的Help->InstallNew So ...

  10. C#多线程的几种使用

    参见链接   :http://www.jb51.net/article/46234.htm