并发编程-java内存模型
1. 基本概念
程序:静态,用于完成某些功能的代码。
进程:动态,运行中的程序
线程:进程中的实际运作单位,一个进程可以包含一个或多个线程。
2. JVM内存区域
- 堆:线程共享,存放实例对象 (OOM)
 - 虚拟机栈 :线程私有 ,Java方法在运行时的内存模型 (OOM),存放局部变量、引用类型数据的地址、操作数栈
 - 本地方法栈
 - 方法区 : 线程共享,存放类信息,常量,静态变量等
 - 程序计数器 : 线程私有, 存放下一条指令的地址
 
3. java内存模型(java memory model, JMM,抽象的模型)
作用: 规范内存空间和工作空间数据的交互

主内存: 线程共享的信息
工作内存:线程私有的信息。基本数据类型,直接分配到工作内存。引用的地址存放在工作内存,引用的对象存放在堆中。
工作方式:
线程修改私有数据,直接在工作空间改
线程修改共享数据,把数据复制到工作空间中,在工作空间中修改,修改完成后,刷新到内存。
4. 硬件内存架构

CPU缓存一致性问题的解决方案:
1. 总线加锁(粒度太大) : 降低CPU的吞吐量
2. 缓存一致性协议(MESI)
读操作:不做任何事情,把cache中的数据读到寄存器
写操作:发出信号通知其他CPU将该变量的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
 
                    
                
                
            
        
浙公网安备 33010602011771号