Java 内存模型(Java Memory Model,JMM),屏蔽各种硬件和操作系统的内存访问差异,以实现 Java 程序在各种平台下都能达到一致的内存访问效果。JDK 5 发布后,Java 内存模型才成熟、完善起来。
主要目的:定义程序中各种变量的访问规则,即关注在虚拟机中把变量值存储到 内存和从内存中取出变量值这样的底层细节。
1. 主内存与工作内存
内存(Main Memory):Java 内存模型规定了所有的变量都存储在主内存中。
工作内存(Working Memory,与处理器高速缓存类比):每条线程都有自己的工作内存,保存了被该线程使用的变量主内存副本,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的数据。不同的线程之间无法直接访问对方工作内存中的变量线程间变量值的传递均需要通过主内存来完成。
2. Java 线程调度
线程调度:指系统为线程分配处理器使用权的过程,主要有两种
- 协同式(Cooperative Threads-Scheduling)线程调度,线程的执行时间由线程本身来控制,线程把自己的工作执行完后,要主动通知系统切换到另外一个线程上去。
- 优点:实现简单,一般没有同步问题
- 缺点:线程执行时间不可控,甚至阻塞
- 抢占式(Preemptive Threads-Scheduling)线程调度,每个线程将由系统来分配执行时间,线程的切换不由线程本身来决定。
- 优点:线程的执行时间可控,不回导致进程、系统阻塞
- 缺点:线程可以主动让出执行时间,但是无法主动获取。 Java采用抢占式调度,但是可以给线程设置优先级,使得某些线程“优先”执行。
3. 线程的状态转换
Java 定义了 6 种线程状态,任意一个时间点,一个线程只能有且只有一种状态
线程状态转换