1. 促进进程和线程出现的原因,是要解决以下问题:
2. 进程: 操作系统为各个独立执行的进程分配各种资源,包括内存,文件句柄以及安全证书等。进程之间可以通过一些粗粒度的通信机制来交换数据,包括:套接字,信号处理器,共享内 存,信号量以及文件等。
3. 线程:线程允许在同一个进程中同时存在多个程序控制流。线程会共享进程范围内的资源,例如内存句柄和文件句柄,但每个线程都有各自的程序计数器,栈以及局部变量等。线程也被称为 轻量级的进程,在大多数现代操作系统中,都是以线程为基本的调度单位。
4. 线程的优势
5.线程带来的风险
6.解决多个线程访问一个可变的状态变量导致出现错误的三种方式
7.线程安全性
当多个线程访问某个类时,不管运行环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。 其中正确性的含义是,某个类的行为与其规范完全一致。在良好的规范中通常会定义各种不变性条件来约束对象的状态,以及定义各种后验条件来描述对象操作的结果。
8.竞态条件
当某个计算的正确性取决于多个线程的交替执行时序时,那么就会发生竞态条件。
“先检查后执行”是一种常见的竞态条件,它的本质是基于一种可能失效的观察结果来做出判断或者执行某个计算。下面的代码LazyInitRace中就包含一个竞态条件,它可能会破坏这个类的正确性。
public class LazyInitRace { private ExpensiveObject instance = null; public ExpensiveObject getInstance() { if (instance == null) { instance = new ExpensiveObject(); } return instance; } }
9.内置锁
java提供了一种内置的锁机制来支持原子性:同步代码块。它包括两部分:一个作为锁的对象引用,一个作为由这个锁保护的代码块。每个Java对象都可以用做一个实现同步的锁,这些锁被称为内置锁或监视锁。线程在进入同步代码块之前会自动获得锁,并且在退出同步代码块时自动释放锁,而无论是通过正常的控制路径退出,还是通过从代码块中抛出异常退出。获得内置锁的唯一途径就是进入由这个锁保护的同步代码块或方法。