第五章 JVM并发-实现

简介: 一、前言前面讲解了JVM类的一些基础,以及JVM怎么通过classLoader去加载一个类,一个类的生命周期等知识,我们至少在理论上对JVM有一个基本的认识,接下来我们看看JVM怎么实施它的并发。

一、前言

前面讲解了JVM类的一些基础,以及JVM怎么通过classLoader去加载一个类,一个类的生命周期等知识,我们至少在理论上对JVM有一个基本的认识,接下来我们看看JVM怎么实施它的并发。

二、

JAVA内存
处理器、高速缓存、主内存之间关系
基于高速缓存的存储很好解决了处理器与内存的矛盾,但是可能存在各自缓存数据已不一致的问题,这时候出现MSI、MESI等协议解决一致性。

2.1主内存与工作内存

java内存模型主要解决的是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中读取变量的这样的低层细节。
为了或得好的执行效率,java内存模型没有限制执行引擎使用处理器的特定寄存器会缓存来和主内存交互,没有限制即使编译器执行代码顺序。(此处主内存只是虚拟机内存的部分可以理解为堆内存,工作内存理解为栈内存)
主内存、线程、工作内存关系
主要的步骤如下:

2.2.1 锁定lock

-主内存,变量标识为一条线程独占状态。

2.2.2 解锁unlock

-主内存,变量释放,释放之后才可以被其他线程锁定。

2.2.3 读取read

-主内存,变量从主内存传输的工作内存。

2.2.4 载入load

-工作内存,蒋read的操作放入工作内存变量副本中。

2.2.5 使用use

-工作内存,使用变量。

2.2.6 赋值assign

-工作内存,变量赋值给其他变量。

2.2.7 存储store

-工作内存,变量传输到主内存。

2.2.8 写入write

-住内存,主内存存储。
tip:只有先read才会load,只有先store才会write,而且不能单独出现。其他的不保证是连续过程,之间可以插入其他操作。

2.2volatile类型变量

被volatile定义之后有特性:保证变量所有线程可见,保证顺序执行。

2.3内存回顾

内存模型核心:处理原子性、可见性、顺序性。

原子性:我们可以认为基础数据类型,有原子性。可以使用 synchronized或者lock与unlock的
可见性:synchronized与final和volatile可以实现
有序性:线程内有序,线程外无序。

程序次序原则:-线程内部有序。
管程多少:unlock必须在lock之后。
volatile变量:写操作优先于读操作。
线程启动规则:start()优先于其他动作。
线程终止规则:stop()优先最弱
线程中断规则:interrupt()优先优先于中断代码检测到中断事件的发生。
对象终结规则:初始化优先于finalize-不要关心这个事情
传递性:a优先b,b优先c,那么a优先c

2.4线程的实现

->使用内核线程实现
属于系统内存线程对应一个我们的轻量线程,就我我常见线程,缺点,是有限的1:1模型。
->使用用户线程是新建
目前基本放弃,多个用户线程对应一个内核线程,而且用户线程自己维护阻塞等等 1:N模型
->使用用户线程加轻量级混合实现
许多操作系统基于此理论实现M:N线程模型
->Java线程实现
1.2之前“绿色线程”,之后也是使用系统线程

2.4线程的状态

-新建:创建为启动new
-运行:可能执行,也可以等待分配 running与ready状态
-无限期等待:没设置超时的wait,没设置超时的join,lockSupport.park()方法。
-限期等待:Thread.sleep(),设置超时的wait,设置超时的join等
-阻塞:同步区域,线程进入阻塞
-结束:以及结束stop
图片来自java虚拟机实践图书

目录
相关文章
|
4月前
|
网络协议 Java 关系型数据库
年薪50W阿里P7架构师必备知识:并发+JVM+多线程+Netty+MySQL
线程基础、线程之间的共享和协作一 线程基础、线程之间的共享和协作二 线程的并发工具类 线程的并发工具类、原子操作CAS 显式锁和AQS一 显式锁和AQS二 并发容器一 并发容器二 并发容器三、线程池一 线程池二、并发安全一
|
3月前
|
存储 分布式计算 前端开发
jvm性能调优实战 - 26一个每秒10万并发的系统如何频繁发生Young GC的
jvm性能调优实战 - 26一个每秒10万并发的系统如何频繁发生Young GC的
61 0
|
3月前
|
存储 算法 安全
JVM-并发标记带来问题和解决办法
JVM-并发标记带来问题和解决办法
39 0
|
4月前
|
消息中间件 算法 Java
三面“有赞”Java岗斩获offer:Spring+JVM+并发锁+分布式+算法
年末离职,年初为面试也筹备挺长一段时间,找了不少复习资料,刷了很多题在网上投了很多简历最终面试了有赞,还有幸拿到offer!
|
8月前
|
消息中间件 算法 Java
三面“有赞”Java岗斩获offer:Spring+JVM+并发锁+分布式+算法
年末离职,年初为面试也筹备挺长一段时间,找了不少复习资料,刷了很多题在网上投了很多简历最终面试了有赞,还有幸拿到offer!
|
10月前
|
存储 缓存 安全
JVM并发
JVM并发
49 0
|
存储 算法 安全
JVM:并发的可达性分析
当前主流编程语言的垃圾收集器基本上都是依靠可达性分析算法来判定对象是否存活的
125 0
JVM:并发的可达性分析
|
存储 算法 Java
面试官:你说你熟悉jvm?那你讲一下并发的可达性分析(1)
面试官:你说你熟悉jvm?那你讲一下并发的可达性分析(1)
173 0
面试官:你说你熟悉jvm?那你讲一下并发的可达性分析(1)
|
缓存 算法 JavaScript
还有程序员搞不懂JVM垃圾回收器并发标记清除回收的内存管理?
JVM中从JDK 4正式引入并发回收,用于解决垃圾回收过程中停顿时间过长的问题。JVM的垃圾回收器通常采用分代设计,新生代和老生代采用不同的垃圾回收算法,在并发垃圾回收器中,新生代采用并行的复制算法,老生代采用并发的标记清除算法
|
存储 负载均衡 算法
6000字吃透JVM垃圾回收器:并发标记清除回收,并行的新生代回收
CMS新生代回收相比串行新生代回收最大的优化是将串行算法升级为并行算法。 并行回收在CMS中被称为ParNew。从串行到并行需要考虑的问题是:如何让多个线程并行地执行任务?如果多个并行线程任务负载不均衡该如何处理?如何判断多个线程并行执行结束?