深入理解JAVA虚拟机阅读笔记5——Java内存模型与线程
Java内存模型是定义线程共享的变量的访问规则(实例字段、静态字段和构成数组对象的元素),但不包括线程私有的局部变量和方法参数。
1.主内存与工作内存
Java内存模型规定,所有的变量都必须存储在主内存中。
线程使用到的变量保存在线程工作内存中,其实主内存的副本拷贝。

2. 内存间的交互操作
- lock : 作用于主内存中的变量,将变量标识为线程独占的。
- unlock :作用于主内存中的变量,将线程独占的变量解锁。
- read :作用于主内存中的变量,将一个变量值从主内存传输到工作内存。
- load :作用于工作内存的变量,将read读入的值放入工作内存的变量副本中。
- use :作用于工作内存的变量,使用该变量。
- assign :作用于工作内存的变量,为变量赋值。
- store :作用于工作内存的变量,把工作内存的值传递给主内存。
- write :作用于主内存的变量,把store的值放入主内存变量中。
3. 对于volatile型变量的特殊规则
3.1 volatile关键字的作用
- 保证此变量对所有线程的可见性。(当一条线程修改了变量值,其他线程是立即得知的,但不代表是线程安全的)
- 禁止指令重排序优化。
3.2 对于long和double型变量的特殊规则(不重要)
long和double的非原子协定。
4. 原子性、可见性和有序性
4.1原子性
Java内存模型直接保证基本数据类型的访问时具有原子性的。使用synchronized代码块保证更大范围内的原子性。
4.2 可见性
volatile可以保证可见性。此外,synchronized和final也可以保证可见性。
4.3 有序性
使用synchronized以及volatile保证有序性。
5. Java与线程
5.1 线程的实现
- 使用内核线程实现
- 使用用户线程实现
- 使用用户线程加轻量级进程混合实现
5.2 Java线程调度
- 协同式调度
- 抢占式调度
5.3 Java线程的状态
- 新建——创建后尚未启动的线程
- 运行——有可能正在执行,也有可能正在等待CPU为它分配时间
- 无限期等待——不会被分配时间,必须等待其他线程将其唤醒。
- 限期等待——一定时间后,被系统自动唤醒。
- 阻塞——等待进入同步区域,或者说等待一个排它锁。
- 结束——已经终止的线程。
深入理解JAVA虚拟机阅读笔记5——Java内存模型与线程的更多相关文章
- 深入理解JAVA虚拟机阅读笔记1——JAVA内存区域
一.Java内存区域 1.程序计数器 线程私有. 当前线程所执行的字节码的行号指示器.由于JAVA是多线程的,因此每个线程都独立的程序计数器. 异常:没有规定任何OutOfMemeryError情况的 ...
- 深入理解java虚拟机阅读笔记(1)运行时数据区域
java虚拟机所管理的内存区域主要分为方法区.堆:虚拟机栈.本地方法栈.程序计数器,如图: 1.程序计数器是当前线程所执行的字节码行号指示器,用以记录当前指令执行的位置.程序计数器是线程私有的,每个线 ...
- 深入理解Java 虚拟机阅读笔记(一)
1.程序计数器- 占用空间:较小 作用:字节码行号指示器 作用详情:指示指令执行,如(字节码的执行,分支,循环,跳转,异常处理,线程恢复) 特点:线程私有(每个计数器独立计算,上下文相互独立). 2. ...
- 深入理解Java虚拟机--阅读笔记二
垃圾收集器与内存分配策略 一.判断对象是否已死 1.垃圾收集器在对堆进行回收前,要先判断对象是否已死.而判断的算法有引用计数算法和可达性分析算法: 2.引用计数算法是给对象添加引用计数器,有地方引用就 ...
- 深入理解Java虚拟机--阅读笔记一
Java内存区域 一.java运行时数据区域 1. 程序计数器:程序计数器占据的内存空间较小,是当前运行线程执行的字节码的计数:分支.循环.跳转.异常处理.线程恢复等都要依赖技术器来对执行的字节码进行 ...
- 深入理解JAVA虚拟机阅读笔记4——虚拟机类加载机制
虚拟机把描述类的Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 在Java语言中,类型的加载.连接和初始化过程都是 ...
- Java虚拟机之JVM系统和内存模型
1.类加载子系统 负责从文件系统或者网络中加载Class信息,加载的信息存放在一块称之为方法区的内存空间里. 2.方法区 存放类信息.常量信息.常量池信息.包括字符串字面量和数字常量等,方法区的大小决 ...
- 深入理解JAVA虚拟机阅读笔记6——线程安全与锁优化
线程安全:如果一个对象可以安全的被多个线程同时使用,那它就是线程安全的. 一.Java中的线程安全 1.不可变 不可变的对象一定是线程安全的.String.枚举类型.java.lang.Number的 ...
- 深入理解JAVA虚拟机阅读笔记3——垃圾回收器
一.垃圾收集器总览 新生代:Serial. ParNew. Parallel Scavenge 老年代:CMS.Serial Old. Parallel Old 最新的:G1 并行和并发的区别: 并行 ...
随机推荐
- sqlyog 可视化查看数据库关系并创建外键
+ 一个架构设计器,把表拖进来即可查看数据库关系 如果要建立外键,需要在两个要被建立的外键之间进行操作(经过验证不需要都为主键),然后从用鼠标把子外键拖到父外键中,就可以关联上了. 参考: https ...
- UWP 卡片视图 Card View
上一篇 提到了 UWP 轨道视图Orbit View,这次就说一下卡片视图,毕竟两个差不多. 卡片视图,效果如其名,卡片一样,左右滑动,当然能翻牌最好了. 嗯,我这个可以的额(⊙﹏⊙)... 看下效果 ...
- REVIT个人学习笔记——1.简介及熟悉界面
此贴并非教学,主要是自学笔记,所述内容只是些许个人学习心得的记录和备查积累,难以保证观点正确,也不一定能坚持完成. 如不幸到访,可能耽误您的时间,也难及时回复,贴主先此致歉.如偶有所得,相逢有缘,幸甚 ...
- SQL Server Management Studio 键盘快捷键
光标移动键盘快捷键 操作 SQL Server 2012 SQL Server 2008 R2 左移光标 向左键 向左键 右移光标 向右键 向右键 上移光标 向上键 向上键 下移光标 向下键 向下键 ...
- 【转】sshpass-Linux命令之非交互SSH密码验证
sshpass-Linux命令之非交互SSH密码验证 ssh登陆不能在命令行中指定密码.sshpass的出现,解决了这一问题.sshpass用于非交互SSH的密码验证,一般用在sh脚本中,无须再次 ...
- python里的魔法方法1(构造与析构)
魔法方法——构造与析构 1.python编程的魔法方法: (1)魔法方法总是被双下划线包围,例如__init__: (2)魔法方法是面向对象的python的一切. 2.__new__(class[,… ...
- 从python容器中随机选取元素
# 1.使用python random模块的choice方法随机选择某个元素 import random foo = ['a', 'b', 'c', 'd', 'e'] from random imp ...
- Docker配置
Docker基本配置 1.安装 在ubuntu下面执行 wget -qO- https://get.docker.com/ | sh 命令安装Docker. 如果命令的方式无法安装,也可以使用apt- ...
- FileZilla-FTP连接失败
状态: 已登录状态: 读取“/”的目录列表...命令: CWD /响应: 250 CWD successful. "/" is current directory.命令: TYPE ...
- [转] Unicode字符编码区间表
firebug 打UTF8 字符: var res = ""; for(var i=0x80;i< 0xff ;i++){ res += i.toString(16) + & ...