线程和JVM
1、基本概念
- 程序:是一组指令的有序集合,本身没有任何运行的含义,只是一个静态的实体
- 进程:指具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个基本单位
程序和进程的区别和联系:
1、程序是静态的,进程是动态的,有自己的生命周期,反应了一个程序在一定的数据集上运行的全部动态过程。
2、进程和程序也不是一一对应的。一个程序运行在不同的数据集上就称为不同的进程。一般来说一个进程会有一个与之对应的程序,而且只有一个。而一个程序可以没有进程,也可以有多个进程- 线程:线程是进程的一个实体,是CPU调度和分派的基本单位。线程基本上不拥有系统资源,只具有一些在运行中必可不少的资源。
线程和进程的区别和联系:
1.进程在执行过程中拥有独立的内存单元,而多个线程共享内存。所以在同一进程下的多个线程更容易进行通信。
2.一个程序至少有一个进程,而一个进程至少有一个线程。
3.进程是资源分配的最小单位,线程是程序执行的最小单位。
2、JVM和线程
- JVM的一次运行最基本的资源占有单位也是线程
- JVM的启动流程
1、类被调用->JVM线程->其他线程
3、JVM内存区域
方法区:类信息、常量、static、jit(及时编译)
堆区:实例对象
VM stack:java方法在运行的内存模型(局部变量、引用类型时间的地址、操作数栈)
PC:java线程的私有数据。
4、 Java内存模型 JMM(抽象的概念)
- 主内存:共享的信息
- 工作内存:私有信息、基本数据类型、引用对象的地址
- 工作方式:
1、线程修改私有数据,直接在工作空间修改
2、线程修改共享数据,把数据复制到工作空间,然后在工作空间进行修改,修改完后才能后刷新共享内存的数据
5、 硬件内存架构和内存模型
5.1、 硬件架构
- CPU获取数据的方式:
CPU <=> CPU寄存器 <=> Cache(一级、二级、三级缓存) <=> 内存- 并发时出现的问题:
1、CPU缓存的一致性问题(典型的i++):并发处理,导致数据的不同步
解决方案:
1、总数加锁 减低CPU的吞吐量
2、缓存上的一致性协议(MESI):当CPU在chche中操作数据时,如果该数据是共享变量,就将该数据读到寄存器中进行修改,并更新内存数据,并将该Cache中数据标志为不可读,其他cpu就必须冲内存中读数据。
5.2 java内存模型和硬件的关系
JVM工作空间可能存在的数据:CPU寄存器、cache、主内存的数据
JVM主内存可能存在的数据:CPU寄存器、cache、主内存的数据
注意:工作空间和主内存数据存在相同,就可能导致数据不一致的问题。
5.3 Java内存模型的必要性
JMM作用:就是规范内存数据和工作空间数据的交互
6、并发编程的三个重要特征
- 原子性:指一个操作不可中断,不受其他线程的干扰。
- 可见性:线程只能操作自己操作空间中的数据
- 有序性:因为程序中的顺序不一定就是执行的顺序,所以需要保证有序性
JMM对三个特征的保证
- JMM和原子性
1)x=10 当操作私有数据时是原子操作,共享数据时不是原子操作
2)x=y 不是原子操作,但是他拆分的每个操作都是原子操作- JMM和可见性
- volatile:在JMM模型上实现了MESI的协议
2)synchronized:通过锁来实现
- JMM和有序性
1)Happen-Before规则
1.1 程序次序原则
1.2 锁定原则
1.3 volatile原则
1.4 传递原则: A–B--C=>A–C