简介
在一台处理器上“同时” 处理多个任务,是在同一个实体上的多个事件,在同一时间间隔发生。
- 从程序设计角度,是希望通过某些机制让计算机可以在一个时间段内,执行多个任务。
- 从计算机CPU硬件层面来说,是一个或多个物理CPU在多个程序之间多路复用。
- 从调度算法角度来说,当任务数量多于CPU的核数时,并发编程能够通过操作系统的任务调度算法,实现多个任务一起执行。
特性
- 原子性
- 可见性
- 有序性
从CPU谈并发编程
CPU --> 缓存 --> 主内存
缓存出现后,系统变得越来越复杂,缓存和主内存之间速度差异被拉大。由于CPU的频率太快了,快到主内存跟不上,这样在线程处理器时钟周期内,CPU常常需要等待主存。
逻辑上,我们认为计算机可以同时运行多个任务,但从CPU硬件层面来说,多个任务同时运行,本质是CPU执行线程的切换(本质是CPU的频率够快)。
我们引入了并发概念,充分利用CPU资源,建设CPU等待时间,达到最理想的
操作系统、进程、线程之间的联系和区别
操作系统 》 多个进程 》 多个线程
进程是计算机中的程序关于某数据集合上的一次运行活动。时系统进行资源分配和调度的基本单位,是操作系统结构的基础。
线程是操作系统能够进行资源调度的最小单位,它被包含在进程之中,是进程中的实际运作单位,每个线程执行的都是进程的某个代码片段,特定的线程总是执行特定的任务。
诞生起源:现有进程后有线程,进程由于资源利用率、公平性和便利性诞生。处理器速度往往比外设的速度快(鼠标、键盘),为了提高CPU的利用率,诞生了线程,目的是为了提高程序的执行效率
共享内存:默认情况下,进程的内存无法与其他进程共享。线程共享操作系统分配给其父进程的内存块。
串行、并行和并发
以前的概念:( 串行:顺序执行,按部就班。在A任务执行完之前不可执行B任务 并行:同时执行,多管齐下。指两个以上事件或活动在同一时刻发生。在多道程序环境下,并发性使多个程序同一时刻可在不同CPU核心上同时运行。 并发:穿插执行,减少等待。指多个线程轮流穿插执行,并发的实质是一个物理CPU在若干到程序之间多路复用,其目的是提高有限物理资源的运行效率。 )
-
现代操作系统,当运行一个程序是,如果该程序是多线程的,那么操作系统可以将这些线程分配到不同CPU核心上执行。
-
java多线程应用程序在多核CPU上运行的方式与操作系统层面的机制紧密相关。Java通过其内置的线程模型以及JVM的支持,可以充分利用多核处理器优势。
-
JVM自身并不直接管理线程调度,而是依赖底层操作系统的线程调度器。创建Java线程时,JVM会调用操作系统的接口来创建一个本地线程。
-
操作系统负责将这些线程分配到不同的CPU核心上执行。
-
Tread类:是java中所有线程对象的基础
-
并发库:Executer框架、fork/join 框架等,主要目的是简化多线程编程,有效管理和优化多线程应用。
-
同步机制:多种同步机制来处理共享资源访问的问题,例如:synchronized、ReentrantLock等,同步机制确保了即使多个核心通知执行不同线程情况下,数据的一致性和完整性。
-
内存模型:java内存模型,定义了主存和工作内存之间的交互规则,确保了可见性和顺序性。保证了多线程环境下,变量的更新对其他线程的可见性,并且控制着指令重排的行为。
-
性能优化:调整JVM参数来优化多线程应用的性能:堆的大小、垃圾回收策略
-
并发工具类:concurrentHashMap、AtimicInteger等非阻塞数据结构和原子变量,可以在多核环境中提供高效的并发支持。