一、进程和线程

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
线程允许程序控制流(control flow)的多重分支同时存在于一-个进程。它们共享进程范围内的资源,比如内存和文件句柄,但是每一个线程有其自己的程序计数器(programcounter)、栈( stack)和本地变量。线程也为多处理器系统中并行地使用硬件提供了一个自然而然的分解;同一程序内的多个线程可以在多CPU的情况下同时调度。线程有些时候被称为轻薰级进程( lightweight processes),并且大多数现代操作系统把线程作为时序调度的基本单元,而不是进程。

因为线程共享其所属进程的内存地址空间,因此所有同一进程中的线程访问相同的变量,并从同一个堆中分配对象,这相对于进程间通信(inter-process)机制来说实现了良好的数据共享。但是如果没有明确的同步来管理共享数据,一个线程可能会修改其他线程正在使用的数据,产生意外的结果。

二、线程的优点

恰当地使用线程时,可以降低开发和维护的开销,并且能够提高复杂应用的性能。

三、线程的风险

image.png
image.png
UnsafeSequence中的问题是,在一些特殊的时序情况下,两个线程可以调用getNext并得到相同的返回值。图1.1表现了这是如何发生的。自增操作value++可能看起来是一个单一的操作,但是事实上它分为3个独立的操作:读取这个值,使之加1,再写入新值。因为这些操作发生在多个线程中,这些线程可能交替占有运行时(runtime),所以两个线程很可能同时读取这个值,两个线程都得到相同的值,并都使之增加了1。结果就是不同的线程返回了相同的序列数。
image.png
在缺少同步的时候,编译器、硬件和运行时事实上对时间和活动( action)顺序是很随意的,比如在寄存器或者高速缓存中存储变量,这样会使它们对于其他线程暂时(甚至是永远)不可见。这样的行为被普遍认为是能提高性能的非常可行的办法,但是这给开发人员带来了负担,他们需要明确识别数据在线程中究竟如何共享,这样这些优化才不至于破坏安全。