第12章 Java内存模型与线程
参考《深入理解Java虚拟机》
一、Java内存模型
1、Java内存模型

2、内存间交互操作

流程图:

3、volatile关键字
两个特性:
3.1、保证变脸对所有线程的可见性;
由于volatile变量只能保证可见性,在不符合两条规则的运算场景中,仍然需要通过枷锁来保证原子性。
①运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值。
②变量不需要与其他的状态变量共同参与不变约束。
3.2、禁止指令重排序优化。
4、对于long和double型变量的特殊规则
对于64位的数据类型(long和double),允许虚拟机将没有被volatile修饰的64位数据的读写操作划分为两次32位的操作来进行,即允许虚拟机实现选择可以不保证64位数据类型的load、store、read和write这4个操作的原子性,这点就是所谓的long和double的非原子性协定。
5、并发编程三种特性
原子性、可见性和有序性(含义不在赘述)。
除了volatile之外,Java还有两个关键字能实现可见性,即synchronize和final。
6、先行发生原则
程序次序规则、管程锁定规则、volatile变量规则、线程启动规则、线程终止规则、线程中断规则、对象终结规则、传递性。
二、线程
1、线程的实现
实现线程主要有3中方式:使用内核线程实现、使用用户线程实现和使用用户线程加轻量级进程混合实现。
1.1、使用内核线程实现
内核线程(Kernel-Level Thread,KLT)就是直接由操作系统内核(Kernel,下称内核)支持的线程,这种线程由内核来完成线程切换,内核通过操作调度器(Scheduler)对线程进行调度,并负责将线程任务映射到各个处理器上。每个内核线程可以视为内核的一个分身,这样操作系统就有能力同时处理多件事情,支持多线程的内核就叫做多线程内核(Multi-Thread Kernel)。
程序一般不会直接去使用内核线程,而是去使用内核线程的一种高级接口--轻量级进程(Light Weight Process,LWP),轻量级进程就是我们通常意义上所讲的线程,由于每个轻量级进程都由一个内核线程支持,因此只有先支持内核线程,才能有轻量级进程。
1.2、使用用户线程实现
1.3、使用用户线程加轻量级进程混合实现
1.4、Java线程的实现
2、Java线程调度
线程调度是指系统为线程分配处理器使用权的过程,主要调度方式有两种,分别是协同式线程调度和抢占式线程调度。
3、线程状态转换(图片来自JavaGuide)


第12章 Java内存模型与线程的更多相关文章
- 深入理解java虚拟机-第12章Java内存模型与线程
		第12章 Java内存模型与线程 Java内存模型 主内存与工作内存: java内存模型规定了所有的变量都在主内存中,每条线程还有自己的工作内存. 工作内存中保存了该线程使用的主内存副本拷贝,线程对 ... 
- 《深入理解java虚拟机》第二章 Java内存区域与内存溢出异常
		第二章 Java内存区域与内存溢出异常 2.2 运行时数据区域 
- 《深入理解JAVA虚拟机》----------第二章 JAVA内存区域与内存溢出异常,笔记(下)
		2. HotSpot虚拟机对象探秘 2.1 对象的创建 虚拟机遇到一条New指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初 ... 
- [深入理解JVM虚拟机]第2章-Java内存区域与内存溢出异常
		2.0引-Java内存区域中,栈内存和堆内存分别装什么,为什么? 栈:解决程序的运行问题,即程序如何执行,或者说如何处理数据. 堆:解决的是数据存储的问题,即数据怎么放,放在哪儿. 参考链接https ... 
- Java虚拟机之JVM系统和内存模型
		1.类加载子系统 负责从文件系统或者网络中加载Class信息,加载的信息存放在一块称之为方法区的内存空间里. 2.方法区 存放类信息.常量信息.常量池信息.包括字符串字面量和数字常量等,方法区的大小决 ... 
- 《深入理解Java虚拟机》-----第12章 Java内存模型与线程
		概述 多任务处理在现代计算机操作系统中几乎已是一项必备的功能了.在许多情况下,让计算机同时去做几件事情,不仅是因为计算机的运算能力强大了,还有一个很重要的原因是计算机的运算速度与它的存储和通信子系统速 ... 
- Java 运行时数据区和内存模型
		运行时数据区是指对 JVM 运行过程中涉及到的内存根据功能.目的进行的划分,而内存模型可以理解为对内存进行存取操作的过程定义.总是有人望文生义的将前者描述为 "Java 内存模型" ... 
- 深入理解java虚拟机_第二章_读书笔记
		1.本章内容目录: 概述 运行时数据区域 程序计数器 java虚拟机栈 本地方法栈 java堆 方法区 运行时常量池 直接内存 HotSpot虚拟机对象探秘 对象的创建 对象的内存布局 对象的访问定位 ... 
- 《深入理解Java虚拟机》学习笔记之内存分配
		JVM在执行Java程序的过程中会把它所管理的内存划分若干个不同的数据区域,如下图: 大致可以分为两类:线程私有区域和线程共享区域. 线程私有区域 程序计数器(Program Counter Regi ... 
随机推荐
- 【Android】是时候为你的应用加上WebDav同步了
			WebDav是什么? WebDAV (Web-based Distributed Authoring and Versioning) 一种基于 HTTP 1.1协议的通信协议.它扩展了HTTP 1.1 ... 
- iptables做nat网络地址转换
			iptables做nat网络地址转换. 0. 权威文档 http://www.netfilter.org/documentation/HOWTO/NAT-HOWTO-6.html e文好的直接跳过本文 ... 
- vue中v-for索引不要用key
			今天发现在给元素v-for渲染的时候,想给元素添加key特性存储索引,发现不奏效: <div class="apic" v-for="(pic,index) in ... 
- Django之JSON数据格式
			JSON简介: o JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) o JSON 是轻量级的文本数据交换格式 o JSON ... 
- Hbase javaAPI报错:Callexception,tries=10,retries=35,started=38465msago
			[client.RpcRetryingCaller(142)]Callexception,tries=10,retries=35,started=38465msago,cancelled=false, ... 
- Python之日志处理(logging模块一基础)
			转载自:https://www.cnblogs.com/yyds/p/6901864.html 本节内容 日志相关概念 logging模块简介 使用logging提供的模块级别的函数记录日志 logg ... 
- docker的file内容解释
			关键字---重点啊) FROM 基础镜像,当前新镜像是基于哪个镜像的 MAINTAINER 镜像维护者的姓名和邮箱地址 RUN 容器构建时需要运行的命令 EXPOSE 当前容器对外暴露的端口 WO ... 
- vue端口号被占用
			今天在启动一个Vue项目的时候,遇到了一个问题. 得知是Vue项目端口号占用的问题. 解决方法: 换一个端口号. 在调用 npm run dev 的时候,实际上是在调用根目录下的 package ... 
- 小工具之apk黑屏自动检测
			在打包测试的时候经常发送给测试组之后,发现已进入游戏就黑屏,这个就浪费了测试组的精力,如果要测试多款产品的话,就会因为黑屏问题做很多无用功,这是程序就需要在发给测试的时候自己先测试产品会不会黑屏.同样 ... 
- HTTP 冷知识 | HTTP 请求中,空格应该被编码为 %20 还是 + ?
			HTTP 请求中,空格应该被编码为什么?今天我们走进 RFC 文档和 W3C 文档,了解一下这个「史诗级」大坑. 1.%20 还是 + ? 开始讲解前先看个小测试,在浏览器里输入 blank test ... 
