1. java内存模型
1.1.主内存和工作内存
- 工作内存保存了主内存的副本
- 线程对变量的所有操作都是基于工作内存进行的,线程执行完成后会将工作内存同步到主内存中
1.2 volatile
可见性:
1.修改变量后会立即同步到主内存中去。
2.使用此变量之前需要同步最新的数据到工作内存
有序性:
内存屏障,禁止指令重排序
原子性:
不具备原子性
1.3 先行发生原则-happens-before
happens-before 是解决内存有序性和可见性的问题。
java代码编译成计算机指令后,计算机在执行指令时会进行一定程度的重排序。happens-before规则相当于java设计者和java开发者之间的约定。即开发者不需要关心计算机底层的细节,只要开发者遵循设计者设定的happens-before原则,可以保证共享变量的可见性。
这些规则分为两类:
1 已经存在的
- 单一线程原则
- 等等
2 开发者自行保证
- volatile可见性:虽然说volatile变量对其他线程是可见的,但也要在遵循happens-before原则的前提下,如果开发者没有遵循happens-before原则,那结果是无法保证的
java线程
线程模型
Hotspot 虚拟机的线程模型是基于1:1模型实现的,即一个java线程都映射一个操作原生系统的线程
线程调度:
1 抢占式:由操作系统分配时间片。线程无法决定执行的时间,完全取决于操作系统的调度,但是可以主动让出执行时间。
2 协同式:线程执行完成后通知操作系统切换线程,所以也不会出现线程安全的问题
线程优先级:
由于java线程和操作系统的原生线程是存在一一映射的,所以尽管可以在程序中设置线程的优先级,但是最终的解释权仍在操作系统中。例如:window 中只有7中优先级,java却提供的10种优先级。这种就导致java中的1和2 对应操作系统的1,3和4 对应操作系统的2…。所以线程的优先级并不是稳定的。
本文介绍了Java内存模型,包括主内存与工作内存的区别,volatile关键字的可见性和有序性,以及先行发生原则的作用。同时讨论了Hotspot虚拟机的线程模型,线程调度方式(抢占式和协同式)以及线程优先级的实现特点。





