JUC简介
JUC
是JDK中java.util.concurrent
工具包的简称,这是一个处理线程的工具包,其目的是为了更好的支持高并发任务。(JDK1.5开始出现的)
进程、线程和管程
进程
进程(Process)
是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位
,是操作系统结构的基础
。在面向线程设计的计算机结构中,进程是线程的容器
。程序是指令、数据及其组织形式的描述,进程是程序的实体。
狭义定义:
进程是正在运行的程序的实例。
广义定义:
进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它是操作系统执行的基本单元,在传统的操作系统中,进程即是基本的分配单元,也是基本的执行单元。
总体来说,进程是指系统中正在运行的一个应用程序,是计算机中资源分配的最小单位。
线程
线程(Thread)
是操作系统能够进行运算调度的最小单位。它存活于进程中,是进程中实际运作单位。一条线程指的是进程中一个单一顺序的控制流。一个进程中可以并发执行多个线程,每个线程执行不同的任务。
总体来说,线程是系统分配处理器时间资源的基本单元,或者说进程内独立执行的一个单元执行流。是程序执行的最小单位。
管程
管程
是一种程序结构,又称为监视器。结构内的多个子程序形成的工作线程互斥访问的共享资源。它提供了一种机制,线程可以临时放弃互斥访问,等待条件满足时才重新获取执行权。
JVM中同步是基于进入和退出**管程对象(Monitor)**实现的,每个对象都会有一个管程对象,管程会随着Java对象一同创建和销毁。
线程执行首先要持有管程对象,然后才能执行方法,当方法完成后会释放管程,方法在执行时会持有管程,其他线程无法再获取同一个管程。
并发和并行
在了解并发和并行前,先了解什么事串行。
串行
串行:
即表示所有任务按照先后顺序依次进行。串行每次只能取并且处理一个任务。
例如:在火车站窗口买票,只有等待前面的人买到票处理完了之后,才会处理后面一个人,即按照先后顺序处理买票。
并发
并发:
多个程序可以同时运行的现象,即计算机同时运行多条指令。并发描述的是多进程同时运行的现象,重点在于它是一种现象
。这里的“同时运行”表示的不是真的同一时刻有多个线程同时运行的现象,而是看起来多个线程同时运行。单核CPU任意时刻只能运行一个线程。
并发是同一时刻多个线程访问同一个资源
并行
并行:
指同时获得多个任务,并同时去执行所取得的这些任务(在同一个时间段内,多个程序同时执行)。并行的效率从代码层次上强依赖于多进程/多线程,从硬件角度上则依赖于多核CPU。
并行模式相当于将长长的一个队列,划分为多个短队列,所以并行缩短了任务对列的长度。
并行是多项任务同时执行
用户线程和守护线程
用户线程
用户线程:
指不需要内核支持而在程序中实现的线程,其不依赖于操作系统的核心,应用程序利用线程提供创建、同步、调度和管理线程的函数来控制。
守护线程
守护线程:
指程序运行的时候在后台提供的一种通用服务的线程,用来服务用户线程。例如垃圾回收。
注意:
- 当主线程结束后,用户线程还在运行,JVM存活。
- 若没有用户线程,只有守护线程,JVM结束