第一章 走入并发世界

1.1 基本概念

1.1.1同步和异步:

去商场买台空调,顾客选定好样品后,售货员去仓库取货,顾客要等待取回空调后一起回家,这个过程叫同步。顾客如果选择网购,在网上下完单后,可以干些别的事,快递员回将空调送货上门,这个过程叫异步。

1.1.2并发和并行:

并发和并行都可以表示多个任务一起执行。并发偏重于多个任务交替执行,多个任务间还有可能是串行的,而并行是真正意义上的同时执行。

比如爬山时边走路边看风景,人看风景时会停下脚步,继续赶路时则专注赶路,这叫并发。

如果人选择坐缆车上山,缆车控制行,人看风景,这叫并行。

如果系统只有一个cpu,只能实现并发,多个cpu才能实现并行。

1.1.3临界区

临界区用来表示一种公共资源或共享数据,可以被多个线程使用,但同一时刻只能被一个线程使用。

1.1.4死锁,活锁,饥饿

死锁:几个进程相互占用资源,如果都不释放资源就会一直保持这种状态。

饥饿:某个进程或多个进程因为种种原因无法获取需要的资源,导致一直无法执行。比如说优先级太低。

活锁:两个线程秉承着“谦让”的原则,主动释放资源给他人使用,资源就会在两个线程之间跳动,都不能正常执行。

1.2 java内存模型(JMM)

1.2.1原子性:一个操作是不可中断的。即使在多个线程一起执行的情况下,一个操作一旦开始就不会被其他线程打扰。

1.2.2可见性:一个线程修改了某一共享变量的值,其他线程不一定能立刻知道这个修改。

1.2.3有序性:在并发时,程序的执行可能出现乱序,写在前面的代码可能在后面执行。

指令重排对于提高cpu性能是十分必要的,虽然会带来乱序的问题,但是这点牺牲是值得的。