Java多线程与并发 浅析

进程与线程

进程是系统分配资源的基本单位,线程是调度CPU的基本单位。
一个进程至少包含包含一个线程,线程寄生在进程当中。
每一个线程都有一个程序计数器、一组寄存器、堆栈。

线程等级

线程分为两类:用户级线程(ULT,User-Level Threa),内核级线程(KLT,Kernel-Level Thread)。
系统空间分为两类:用户空间,内核空间。
用户级线程只能访问用户空间,不能访问内核空间,如有需要则须借助系统提供的接口。
划分线程等级是为了保护系统的安全性。
以下是ULT和KLT在系统空间中的分布:
Java多线程与并发 浅析_第1张图片

Java 线程

JDK 1.2 之后使用的是KLT,使用方式见下图:
Java多线程与并发 浅析_第2张图片
Java线程的生命周期,如下图:
Java多线程与并发 浅析_第3张图片

并发

什么是并发

并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。

并发与并行

并发指的是多个任务交替进行,而并行则是指真正意义上的“同时进行”。
举个例子,你边敲代码边听着歌,这就是并行;你敲了会代码敲累了,然后拿着手机刷了刷新闻,刷完了接着敲,这就是并发。

并发编程

并发编程的本质其实就是利用多线程技术,在现代多核的CPU的背景下,催生了并发编程的趋势,通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升。
即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现 这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切 换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒。

并发的优点

1.充分利用多核CPU的计算能力。
2.方便进行业务拆分,提升应用性能。

并发的缺点

1.高并发场景下,导致频繁的上下文切换。
那么什么是上下文切换呢?如果有两个线程同时执行,CPU会给每一个线程提供时间片,线程1在时间片内如果没有完成任务,那么它的状态将会被保存起来,然后切换成线程2执行,线程2的时间片结束之后,再取出线程1继续执行,如此反复,直至两个线程都完成任务。而保存线程状态,到再次加载线程的这个过程,就是一次上下文切换。保存和再次加载的这个过程是非常消耗资源的,所以并发是有可能降低效率的。
2.临界区线程安全问题,容易出现死锁的。
死锁是怎么出现的呢?假如线程1和线程2同时需要使用a和b两个临界资源,结果线程1取到了a的锁,线程2取到了b的锁,两个线程都在等待对方释放所需的资源,又都无法完成任务释放资源,导致都进入了无尽的等待之中,这便是死锁。

【个人笔记】转载请注明出处!

你可能感兴趣的:(Java并发编程)