一、并行基础

  同步/异步:以购物为例,如果你去商场买东西,下单后你需要等售货员去仓库调配货物,然后付款带回家,整个过程是一条直线,这就是同步调用。如果你是网上购物,网上下单付完钱之后,对你来说购物过程就已经结束了,接下来你可以做点其他的事情,比如看电视、做饭,等着商家送货就行了,整个过程在付完钱后出现了分叉,这就是异步调用。

  并发/并行:并发是指在多个任务交替执行,多个任务之间存在串行;而并行则是真正的多个任务同时执行。以爬山看景为例,爬山时需要看脚下的路,则不能欣赏景色;观赏周边的景物时,则需要停下来(安全第一,切勿只顾美景,不看脚下),这个过程就可以看作是并发。而如果是坐缆车,则上山和看景是同时进行的,即可看作是并行

  临界区:可以表述为多个线程都可访问的资源,但是当线程一访问使用临界区资源时,其他线程如果想要使用该资源,需要等待。

  阻塞/非阻塞:用来形容多线程之间的相互影响。如果一个线程占用了临界区资源,其他所有需要改资源的线程都需要在临界区等待,等待会导致线程挂起,这种情况就是阻塞。反之,任何线程都不会妨碍其他线程执行,所有线程都会尝试不断前向执行,这种就是非阻塞。

  死锁:A需要B手里的资源,而同时B需要A手里的资源,但是A和B都不愿先释放自己手里的资源,导致资源占用,线程挂起无法继续执行下去。

  饥饿:因为某种原因线程一直拿不到需要的资源,导致线程挂起难以执行下去。

  活锁:A和B需要同时访问同一个资源,但是都希望对方先去使用,导致线程挂起无法继续执行下去。

并发级别:阻塞、无饥饿、无障碍、无锁、无等待。

二、JMM—Java内存模型

    原子性(Atomicity):类似于数据库的原子性,一个操作是不可中断的。

    可见性(visibility):当一个线程修改了一个变量时,其他线程能否立即知道这个改变。A线程和B线程运行在两个cpu上,同时修改变量X,A将X进行了操作并缓存到cache或寄存器中,而B修改了X的值,此时A无法发现X已经被修改了,仍然使用的是缓存中的旧值,至此产生了可见性的问题

    有序性:指令重排,Happen-Before规则

  1. 程序顺序原则:一个线程内保证语义的串行
  2. Volatile规则:volatile变量的写先发生于读,这保证了volatile变量的可见性
  3. 锁规则:解锁unlock必然发生在随后的加锁lock前
  4. 传递性:A先于B,B先于C,A一定先于C
  5. 线程start方法先于它的每一个动作
  6. 线程的所有操作先于线程的终结Thread.join()
  7. 线程的中断interrupt先于被中断线程的代码
  8. 对象的构造函数执行、结束先于finalize()方法

-----------------------------------------------------《实战Java高并发设计》笔记------------------------------------------------------