1. 基本概念
程序:静态,用于完成某些功能的代码。
进程:动态,运行中的程序
线程:进程中的实际运作单位,一个进程可以包含一个或多个线程。
2. JVM内存区域
- 堆:线程共享,存放实例对象 (OOM)
- 虚拟机栈 :线程私有 ,Java方法在运行时的内存模型 (OOM),存放局部变量、引用类型数据的地址、操作数栈
- 本地方法栈
- 方法区 : 线程共享,存放类信息,常量,静态变量等
- 程序计数器 : 线程私有, 存放下一条指令的地址
3. java内存模型(java memory model, JMM,抽象的模型)
作用: 规范内存空间和工作空间数据的交互
主内存: 线程共享的信息
工作内存:线程私有的信息。基本数据类型,直接分配到工作内存。引用的地址存放在工作内存,引用的对象存放在堆中。
工作方式:
线程修改私有数据,直接在工作空间改
线程修改共享数据,把数据复制到工作空间中,在工作空间中修改,修改完成后,刷新到内存。
4. 硬件内存架构
CPU缓存一致性问题的解决方案:
1. 总线加锁 : 降低CPU的吞吐量
2. 缓存上的一致性协议
当CPU在CACHE中操作数据时,如果该数据是共享变量,数据在CACHE读到寄存器中,进行新修改,并更新内存数据
CaCHE LINE置无效,其他的CPU就从内存中读数据
5. java线程与硬件处理器
6. 并发编程的三个特性
原子性:不可分割 x=1
可见性:线程只能操作自己工作空间中的数据
有序性:程序中的顺序不一定就是执行的顺序(编译重排序、指令重排序,目的:提高效率
JMM对三个特征的保证
- JMM与原子性
- X=10 写 原子性 如果是私有数据具有原子性,如果是共享数据没原子性(读写)
- Y=x 没有原子性
- 把数据X读到工作空间(原子性)
- 把X的值写到Y(原子性)
- I++ 没有原子性
- 读i到工作空间
- +1;
- 刷新结果到内存
- Z=z+1 没有原子性
- 读z到工作空间
- +1;
- 刷新结果到内存
多个原子性的操作合并到一起没有原子性
保证方式:
Synchronized
JUC Lock的lock
JMM与可见性
Volatile
Synchronized:加锁
JUC JUC Lock的lock
- JMM与有序性
Volatile:
Synchronized:
Happens-before原则:
- 程序次序原则
- 锁定原则 :后一次加锁必须等前一次解锁
- Volatile原则:霸道原则
- 传递原则:A---B ---C A--C