第12章 Java内存模型与线程

时间:2023-03-08 15:36:06

参考《深入理解Java虚拟机》

一、Java内存模型

1、Java内存模型

第12章 Java内存模型与线程

2、内存间交互操作 

第12章 Java内存模型与线程

流程图:

第12章 Java内存模型与线程

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内存模型与线程

第12章 Java内存模型与线程