一、程序、进程、线程
程序:为完成某一个任务而编写的代码。(静态的概念)。
进程:程序的一次运行。(动态概念)
线程:一个进程里面包含了一个或多个线程。(占有资源的独立概念)
二、JVM内存区域
方法区:存放类信息,常量,static修饰类变量、JIT编译的一些信息。这里面的数据时所有线程共享的。
Java堆区:实例对象(共享)
VM stack:Java方法在运行的内存模型。
三、Java内存模型 JMM
java内存模型是一种规范,而JVM内存模型是它的实现。像mvc和ssm的关系,mvc是一种思想,而ssm框架是真实的实现。
1.主内存:存放共享的信息
2.工作空间:存放私有信息,基本数据类型,会直接存放到工作内存中,引用地址也会存放在工作内存中,引用对象存放在堆中。
3.工作过程:
a.线程修改的是私有数据的话,直接在工作空间修改
b.线程修改共享数据时,首先把数据复制到工作空间中,在工作空间中修改后,再刷新内存中的数据。
c.查找数据时先在工作空间中去查找,如果在工作空间中没有,就从内存中去找。如果一个线程修改了数据,但还没有更新到内存中,然后另外一个线程去读这个数据,这时就会产生线程不安全的问题。
4.JVM和JMM的关系
工作空间就是线程私有的虚拟机栈。
四、硬件内存架构
因为CPU相对与内存执行速度很快,出现执行速度不匹配问题,所以需要添加中间缓存,缓存的处理速度比内存快。
1.工作过程和JMM模型一样
2.问题:缓存一致性问题
3.解决方案:
a.通过总线加锁 只能有一个CPU使用内存,其他CPU不能使用内存。 但这种方案降低了CPU的吞吐量。
b.缓存上面缓存一致性协议(MESI)
当CPU在catch中操作数据时,如果该数据是共享变量,数据在catch中读到寄存器中,进行修改后,并更新到内存数据,在修改数据时在硬件层面上有个信号值cache Line,将此置为无效,当其 它cpu发现缓存无效时就直接从内存中读取数据。
4.JMM和硬件内存架构关系
JMM模型和硬件内存多对多关系,虽然硬件内存架构采用了缓存一致性问题,也会出现数据不一致问题。
5.java线程与硬件处理器的关系
Java内存模型的必要性:规范内存数据和工作空间数据的交互。
五、并发编程的三个重要特性
原子性:不可分割
可见性:线程只能操作自己工作空间的数据。
有序性:程序中的顺序不一定时执行程序,因为会存在编译重排序,指令重排序
六、JMM对以上三个特征的保证
1.JMM与原子性
a.x=10,只是一个写操作,保证原子性
b.使用Synchronized Lock的lock
2.JMM与可见性
a.volatile :在JMM模型上实现MESI协议。
b.使用Synchronized Lock的lock
3.JMM与有序性
a.volatile:锁定的位置不能变化
b.Synchronized:
c.Happens-before原则
1)程序次序原则
2)锁定原则:后一次枷锁必须等前一次加锁。
3)volatile 原则,霸道原则
4)传递原则:a----b----c a----c