并发的本质是什么?
进程是分配资源的基本单位,线程是调度的基本单位。每个线程有一组寄存器,堆栈,一个程序计数器。
并发的核心是如何处理好多线程的分工,同步和互斥的问题。
并发编程的本质是为了解决:可见性,原子性,有序性三大问题。
并发其实是利用多线程技术,在现代 CPU 的背景下,催生了并发编程的趋势,通过编程编程的形式可以将多核 CPU 的计算能力发挥到极致。
并发的优势
并发编程的优势:并发可以充分利用 CPU 计算能力,提升性能。
并发缺点
在高并发场景下,频繁的上下文切换会损耗性能。临界区线程全问题,线程容易产生死锁。
CPU 通过事件片来循环执行任务。当前任务执行一个时间片后切换到下一个任务,会在切换前保存上一个任务状态,方便切换回这个任务,可以加载这个任务的状态。
线程
- 用户线程(User-Level Thread)
- 内核线程(kernel-Level Thread)
用户线程
指不需要内核支持而在用户程序中实现的线程,不依赖操作系统核心,应用进程利用线程库提供创建,同步,调度和管理线程的函数控制用户线程。
内核线程
线程的管理操作都由操作系统内核完成。内核保存线程的状态和上下文信息,当一个线程执行了引起了阻塞系统调用时,内核可以调度该进程的其他线程执行,在多线程系统上,内核可以分派系统进程多个处理器运行。
Java 线程与系统内核线程
Java 创建线程
new java.lang.Thread().start(),使用JNI将一个native thread attach到JVM中针对 new java.lang.Thread().start()这种方式,只有调用start()方法的时候,才会真正的在JVM中去创建线程
主要的生命周期步骤有
- 创建对应的JavaThread的instance
- 创建对应的OSThread的instance
- 创建实际的底层操作系统的native thread
- 准备相应的JVM状态,比如ThreadLocal存储空间分配等
- 底层的native thread开始运行,调用java.lang.Thread生成的Object的run()方法
- 当java.lang.Thread生成的Object的run()方法执行完毕返回后,或者抛出异常终止后,终止native thread
- 释放JVM相关的thread的资源,清除对应的JavaThread和OSThread
- 针对JNI将一个native thread attach到JVM中,主要的步骤有
- 通过JNI call AttachCurrentThread申请连接到执行的JVM实例
Java 线程的生命周期