1.多线程概述
1.1、程序、进程、线程
- 程序: 程序是指令和数据的集合,其本身没有任何运行的含义,是一个静态概念。
- 进程(process): 进程是执行程序的一次执行过程,是一个动态概念,是系统资源分配的单位。在操作系统中运行的程序就是进程,如qq、游戏、IDEA。
- 线程(Thread): 线程是CPU调度和执行的单位。一个进程至少有一个线程,也可有多个线程。
注意:
- 许多 多线程是模拟出来的,真正的多线程是指有多个CPU,即多核,如服务器。
- 模拟出来的多线程,即在一个CPU下,在同一时间,CPU只执行一行代码,因为切换速度快,所以就有同时执行的错觉。
2、线程核心概念:
- 线程就是独立的执行路径。
- 调用start() 方法后,线程不一定立即执行,需要CPU安排调度。
- 在程序运行时,即使没有自己创建线程,后台也会有几个线程,如主线程、GC线程。
- main()被称为主线程,为程序的入口,用于执行整个程序。
- 在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度。线程的执行顺序是不能人为干预的,因为调度器是与操作系统紧密相关的。
- 对同一份资源操作时,会存在资源抢夺问题,需要引入并发控制。
- 线程会带来额外的开销,如CPU调度时间、并发控制开销。
- 每个线程都有自己的工作内存,内存控制不当会造成数据的不一致。
3、普通方法的调用和多线程的调用:
4、线程安全问题
4.1、线程非安全:都是由全局变量
、静态变量
引起的:
- 若每个线程对某个全局变量、静态变量只有读操作,而无写操作,那么这个全局变量是线程安全的。
- 若多个线程对某个全局变量、静态变量同时执行写操作,可能会影响线程安全,要考虑线程同步。
4.2、线程安全:共享资源只读不写
- 常量始终是线程安全的,因为只存在读操作。
- 每次调用方法前都创建一个实例是线程安全的,因为不会访问共享资源。
- 局部变量是线程安全的,因为每执行一个方法,都会在独立的空间创建局部变量,它不会共享资源。(局部变量包括形参和方法内部变量)