多线程编程基础知识
为什么要学习多线程编程
1.它是各类开源框架底层实现的基础
2.它是衡量一个开发人员技术中最重要的标志之一
3.它是Java体系中最重要的知识之一
4.它是成为架构师的必备知识 可以充分利用多核处理器 提高程序性能 提高程序的吞吐量
什么是进程
简单的可以理解为,一个在系统中运行的应用程序就是一个进程
什么是线程
线程也可以叫做轻量级进程,是大多数操作运行时调度的基本单位
什么是并发编程
程序员用编程语言编写出让计算机可以在一个时间段内执行多个任务的程序。
概念分析
轻量级
轻量级的含义:表示线程消费的资源要比进程少,运行速度更快
时序调度
操作系统对任务按照时间的先后顺序 执行调度的过程
时序调度的基本单位就是线程
抢占式
基本的调度方式是抢占式,指的是多个线程以抢占的方式来获取 cpu的时间片段(资源),谁抢到了谁就执行,运行一段时间以后就释放资源,重新抢cpu资源,各线程交替执行
线程和进程
1.线程是轻量级的进程
2.进程之间相互独立,资源不共享
3.同一个进程内的线程是共享资源的
4.线程的切换速度快,而进程的切换速度慢切很消费资源,进程的代价更大
并发和并行
并行是指两个或两个以上的事件在同时发生(必要条件是多核cpu)
并行是在不同的cpu内核中运行的多个事件
并行是在多太处理器上同时处理多个任务
并发是指两个或两个以上的事件在同一时间间隔发生(单核cpu事件交替发生运行)
并发是在同一个cpu中运行的多个事件
并发是在一台处理器的一个内核上同一时间间隔处理的多个事件
临界资源
临界资源是一次仅允许一个进程使用的共享资源.
各进程采取互斥的方式,实现共享的资源称作临界资源。
属于临界资源的硬件有,打印机,磁带机等;软件有消息队列,变量,数组,缓冲区等
同步和异步
同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。
异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。
多线程只是我们实现异步的一种手段。
阻塞和非阻塞
当一个线程占用了临界区资源,那么其它需要使用这个资源的线程都必须在这个临界区上等待。等待会导致线程挂起,这样就形成了阻塞。如果占用资源的线程一直没有释放资源,那么其它的线程在这个临界区上都不能继续工作。
相反,非阻塞表明多个线程之间的执行是不会相互影响的。
线程风险
线程安全问题
多线程条件下,程序运行的结果与预期不符合(结果不对)
伴生现象:出现问题不太容易复现,每次运行的结果都可能不一样
线程活跃度问题
死锁:线程1和线程2互相持有对方执行所必需的锁,都不释放导致无法执行
饥饿:某个线程较长时间或者很难得到执行(抢不到资源)
活锁:线程得到锁,却又相互释放不执行任务
线程的性能问题
主要是线程间切换上下文的开销 切换上下文时线程需要保存它当前的状态,下次抢到运行机会时再切换回来恢复状态,继续运行