深入理解JVM-java内存模型与线程
java内存模型
主内存
工作内存
内存间交互操作
关于主内存和工作内存之间具体的交互协议。即一个变量如何从祝内存拷贝到工作内存,如何从工作内存同步到祝内存之类的实现细节。java内存模型中定义了以下8中操作来完成,虚拟机实现时必须保证下面提到的每一种操作都是原子的,不可分割的。
- lock 作用于主内存
- unlock 作用于主内存
- read 作用于主内存
- load 作用于工作内存
- use 作用于工作内存:他把工作内存中的一个变量的值传递给执行引擎
- assign 作用于工作内存 他把一个从执行引擎接收到的值赋值给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码执行时执行这个操作。
- store 作用于工作内存 他把工作内存中一个变量的值传递到主内存中。
- write 作用于主内存的变量,他把store操作从工作内存中获得的变量的值放入主内存的变量中,
volatile语义
原子性/可见性/有序性
先行发生原则
先行发生时java内存模型中定义的两项操作之间的偏序关系,如果说操作a先行发生于操作比,其实就是说在发生操作b之前,操作a产生的影响能被操作b观察到,影响包括修改了内存中共享变量的值,发送了消息,调用了方法等。
java与线程
实现线程的三种方式
使用内核线程实现
使用内核线程实现
使用用户线程加精良机进程混合实现
线程调度
线程调度是指系统为线程分配处理器使用权的过程。主要调度方式有两种,协同式线程调度和抢占式线程调度。
状态转换
线程安全:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境更下的调度和交替执行,也不用进行额外的同步,或者在戴永芳进行任何其他的协同操作,调用这个对象的行为都可以获得正确的结果,那这个对象时线程安全的。
按照线程安全的安全程度,我们将java语言中各种操作共享的数据分为 以下5类:
不可变;绝对线程安全;相对线程安全;线程兼容;线程对立
锁优化:
- 自旋锁和自适应自旋
- 锁消除
- 锁粗化
- 轻量级锁
- 偏向锁