(给ImportNew加星标,提高Java技能)
编译:ImportNew/唐尤华
0. 引言
本文是多线程技术入门篇,对进程、线程、纤程、并发、并行、线程安全、竞态条件等概念进行了介绍,讨论了多线程技术的实现原理、使用中可能遇到的问题以及如何正确处理。
伴随着硬件和操作系统的进步,现在的计算机能够同时执行多个操作,程序执行更快响应时间缩短。
在软件开发中使用并发既诱人又困难,需要了解计算机底层工作原理。本文是系列的第一篇,从操作系统中线程的基本概念入手,介绍线程背后的魔法。让我们开始吧。
1. 正确认识进程与线程
现在的主流操作系统都支持同时运行多个程序,比如可以一边在浏览器上看这篇文章一边用播放器听歌。运行中的浏览器和播放器程序都是**进程**,操作系统提供了一套机制利用底层硬件保证多个进程同时运行。无论具体采用的是哪种技术,最终让你感觉这些程序是在同时运行。
在操作系统中同时执行多任务,进程不是唯一选项。每个进程都能在内部并发执行子任务,子任务也被称为线程。你可以把线程看成一个进程切片。进程启动时会启动至少一个线程,称为主线程。接下来,根据程序或开发者的需要可以启动新线程或终止线程。多线程即在一个进程中运行多个线程。
例如,播放器会运行多个线程。一个线程显示界面,通常是主线程,另一个线程播放音乐。
可以把操作系统看成进程的容器,而每个进程又是线程的容器。虽然本文只关注线程,但这个主题非常吸引人,值得在未来深入分析。
"1. 操作系统这个盒子里装的是进程,进程又包含了一个或多个线程"
1.1 进程与线程的区别
操作系统会为每个进程分配一块独立的内存。默认情况下,一个进程的内存不能与其他进程共享。例如浏览器不能访问播放器的内存,反之亦然。一个进程启动的多个实例也是如此。启动两次浏览器,操作系统会把每个实例看作一个新进程,并为其分配一块独立的内存。因此,多个进程之间默认是无法共享数据的,除非使用进程间通信(IPC)技术。
与进程不同,线程能够共享父进程的内存。例如播放器中,音乐播放线程可以访问界面线程的数据,反之亦然。因此,线程之间沟通起来更容易。此外,线程占用资源更少,创建速度更快,这就是为什么线程也被称为轻量级进程。
如果没有线程,需要将这些任务作为进程运行并通过操作系统同步。使用 IPC 通信相对困难,而且由于进程比线程更“重”,执行速度也更慢。
1.2 Green Thread 纤程
到目前为止,线程都由操作系统管理,即必须经由操作系统才能启动一个新线程,不过并非所有平台都支持线程。Green Thread 也称为纤程,它模拟线程的工作,可以在不支持本地线程的平台上开发多线程应用。例如,如果操作系统不支持本地线程,虚拟机会实现纤程。
纤程的优点是创建速度快、管理效率高,因为完全绕过了操作系统。但纤程也有缺点,会在下一篇中讨论。
“Green Thread”代指 Sun 公司的 Green Team,他们在