1,什么是并发?
在cpu角度讲,多个cpu的核同时在工做。从Java的角度将,JVM在同一时刻在处理多个线程的请求。html
2,为何要并发?
并发适用于多核处理器,以解决单线程阻塞致使效率低的问题,尽量利用cpu空闲等待时间。java
缺点:线程间的切换具备额外开销。(用户线程的上下文要复制到cpu线程上来执行)api
3,cpu、进程、线程的关系
cpu:执行计算机指令
操做系统的进程:程序的一次执行
操做系统的线程:操做系统调度器的调度的基本单位,交由cpu执行
cpu的线程:存放要执行的数据、指令等,是cpu的基本执行单位跨域
处理器的线程,与操做系统的进程,是 N:N 的关系。
操做系统的进程,与操做系统的线程,是1:N的关系。
因此,处理器线程与操做系统线程之间是 N:N 的关系。
一个进程至少有一个线程。线程不能跨域进程与访问另外一个进程的内容。缓存
备注:
一般cpu的线程和核心数对应,几核就是几线程。可是单个线程并不能让单个cpu核满载形成cpu浪费,因而有了超线程技术,即一个cpu核负责两个或多个线程的运行。安全
4,多线程的使用方式
多线程的使用有两种:协同式和抢占式。
协同式的实现比较简单,因为是在当前线程主动触发其余线程并等待结果返回,对调用者来讲是能够感知的,不存在线程安全问题。缺点是等待的过程是阻塞的,线程阻塞会形成必定程度的浪费性能。好比Lua。而Java采用抢占式。多线程
5,多线程争夺cpu使用权
cpu的基本调度单位是线程,由一个叫作“调度器(scheduler)”的操做系统的组件来调度。cpu的核会在一个 时间片 内执行用户线程的操做。调度器会根据线程的优先级和线程的饥饿程度(等待时间)两个因素来调度线程。并发
6,Java的线程与进程
jvm的线程与进程,是对操做系统的线程与进程的一种封装,方便操做。jvm
jvm将操做系统的进程,封装为Process(抽象类),惟一实现类是ProcessImpl。有建立工具类ProcessBuilder。jvm对进程的封装提供很是少的api,由于制定者不主张在java中以建立进程的方式执行多任务。函数
jvm将操做系统的线程,封装为Runable接口,java.lang包下有两个实现类,Thread和Shutdown。Shutdown是用来执行JVM关闭的时候的钩子函数的。普通代码实际运行的时候,须要一个Thread类的对象来.start()来执行。这个.start()是一个synchronized方法,方法内部会调用native的.start0()交给操做执行。Thread类还提供不少native的方法来供调用。
java.concurrent包下有Callable接口,能够有返回值(Future模式)。
7,线程的缓存与一致性规范
计算机的cpu的运算速度与内存的读写速度相差好几个数量级,所以引入了高速缓存。每一个cpu的线程单独配一个高速缓存。
带来的问题:缓存一致性(CacheCoherence)。为了解决缓存一致性的问题,要求各个处理器访问缓存时遵循必定的协议(好比:MESI协议)。
Java虚拟机有本身的内存模型,虚拟机经过操做系统能够操做cpu的线程和高速缓存,因此Java内存模型定义了如何解决缓存一致性的规范。
8,线程间的数据通信
协同式自然具有线程间的通信能力。Java采用抢占式,线程只与主内存交互。若是线程间须要通信的话,须要先将数据从线程本身的工做内存写回到主内存,另一个线程再从主内容加载到它的线程。
每个java线程拥有本身的工做内存,全部的java线程共用一个主内存。
方便理解:
主内存对应java堆中的对象实例数据部分,物理硬件的主内存。
工做内存对应虚拟机栈中的部分区域,程序运行时主要访问读写的是工做内存。
这种理解是片面的不许确的,但刚接触的时候比较容易理解一些。
参考资料: