上一篇文章开篇就讲了用synchronized实现的并发访问的同步方式与原理,这篇探本溯源来看看与线程以及并发相关的最基础的东西。
进程与线程
现代操作系统在运行一个程序时,会为其创建一个进程。例如,启动一个Java程序,操作系统就会创建一个Java进程。进程是指正在运行的程序,是一个独立的运行环境,它是系统进行资源分配和调度的一个独立单位,进程被创建时,会获得独立的内存单元,且进程与进程之间用户不能直接访问。现代操作系统调度的最小单元是线程,也叫轻量级进程(Light Weight Process),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量,它是进程调度的基本单位。例如:启动一个Java程序时,进入该程序的main方法时,系统就会创建一个相应的线程。处理器在这些线程上高速切换,让使用者感觉到这些线程在同时执行。
线程的实现
并发不一定要依赖多线程( 如PHP中很常见的多进程并发) , 但是在Java里面谈论并发, 大多数都与线程脱不开关系。那么线程是如何具体实现的呢?
OS层实现
线程是比进程更轻量级的调度执行单位, 线程的引入, 可以把一个进程的资源分配和执行调度分开, 各个线程既可以共享进程资源( 内存地址、 文件I/O等) , 又可以独立调度( 线程是CPU调度的基本单位) 。在OS层面,实现线程主要有3种方式: 使用内核线程实现、 使用用户线程实现和使用用户线程加轻量级进程混合实现。