实战Java高并发程序设计笔记
你必须知道的机构概念
-
同步(Synchronous)和异步(Asynchronous)
- 同步和异步通常用来形容一次方法调用。
- 同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为
- 异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回。调用者可以继续后续的操作,整个过程不会阻碍调用者工作
-
并行(Concurrency)和并发(Parallelism)
- 并行和并发都可以表示两个或者多个任务一切执行。并发偏重于多个任务交替执行,多个任务之间有可能是串行的。并行是真正意义上的“同时执行”。
-
临界区
- 临界区用来表示一种公共资源或者说公共数据,可以被多个线程使用,但是每次只能有一个线程使用。一旦临界区资源被占用,其他线程要想使用这个资源就必须等待
死锁(Deadlock)
- 所谓死锁: 是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
- 产生条件
1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。
2)请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
3)不剥夺条件:进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
4)环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。
- 饥饿(Starvation)
- 饥饿是指某一个或者多个线程因为种种原因无法获取所需的资源而导致一直无法运行。例如线程的优先级太低,线程被永久堵塞在一个等待进入同步块的状态。程在等待一个本身也处于永久等待完成的对象(比如调用这个对象的wait方法)。
- 活锁(Livelock)
- 活锁是指线程秉承“谦让”原则,主动将资源释放给他人使用,那么就会出现资源不断在两个线程中跳动而没有一个线程可以同时拿到所有资源而正常执行
- 并发级别
- 阻塞(Blocking)
- 无饥饿(Starvation-Free)
- 无障碍(Obstruction-Free)是指在任何时间点,一个孤立运行线程的每一个操作可以在有限步之内结束。只要没有竞争,线程就可以持续运行,一旦共享数据被修改,Obstruction-free 要求中止已经完成的部分操作,并进行回滚,obstruction-free 是并发级别更低的非阻塞并发,该算法在不出现冲突性操作的情况下提供单线程式的执行进度保证,所有 Lock-Free 的算法都是 Obstruction-free 的。
- 无锁(Lock-Free)指的是整个系统作为一个整体一直运行下去,系统内部单个线程某段时间内可能会饥饿,这是比wait-freedom弱的并发级别,但系统整体上看依然是没有阻塞的。所有wait-free的算法显然都满足lock-free的要求。
- 无等待(Wait-Free)指的是每一个线程都一直运行下去而无须等待外部条件,整个流程中任何操作都能在一个有限的步骤内完成,这是最高的并发级别,没有任何阻塞。