这几天看算法的书籍,学习进度非常缓慢,再次复读一下《JAVA高并发程序设计》,换一下思考的方向并且进行复习
同步&异步
- 同步:一旦方法调用开始,必须等到方法调用返回后,才能继续后续的行为
- 异步:一旦开始,方法调用就会立即返回,斌能够继续后续的操作
并发&并行
- 并发:两个或者多个任务交替执行
- 并行:两个或者多个任务同时执行
临界区
- 表示一种公共资源或者共享数据,可以被多个线程使用,但是每一次,只能有一个线程使用它,一旦临界区资源被占用,其他线程要想使用这个资源,就必须等待
在java中主内存便是这样的临界区,对同一个数据的操作只能同时有一个线程执行
阻塞&非堵塞
- 堵塞:一个线程占用临界区资源,其他所有需要这个资源的线程必须在临界区内进行等待
- 非堵塞:一个线程占用临界区资源,其他线程会尝试向前执行
死锁
集合中的每一个进程都在等待只能由本集合中的其他进程才能引发的事件,那么该组进程是死锁的。
产生死锁的条件
- 互斥条件:一个资源每次只能被一个进程使用。
- 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
- 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
- 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
饥饿
线程因为某种原因无法获得所需要的资源,例如优先级太低导致的抢占不到CPU运行时间片活锁
两个或者多个线程谦让自己的资源,导致资源不断在两个线程中跳动,而没有一个线程同时拿到所有资源而正常执行并发级别
- 阻塞:如果拿不到临界区的锁,线程就会被挂起等待,直到其他线程释放
- 无饥饿:线程公平,满足先来后到
- 无障碍:都可以进入临界区,修改共享数据,一旦检测到数据变得,会对自己的修改进行回滚,直到成功并退出临界区
- 无锁:所有的线程都会对临界区进行访问,保证只有一个线程能在有限步里离开临界区
- 无等待:要求所有线程都必须在有限步内完成
Amdahl定理
加速比定义:加速比=优化前系统耗时/优化后系统耗时
优化的效果取决于CPU数量以及系统中串行化程序的比重Gustafson定理
执行时间=a串行时间+b并行时间
执行总时间=a串行时间=n处理器个数b并行时间
加速比=(a+nb)/(a+b)
F=a/(a+b)
如果串行化比例小,并行化比例大,只要添加处理器个数就能得到更快的速度JVM线程
- 原子性:一个不可中断的操作,不会被其他线程所干扰
- 可见性:一个线程修改了一个共享变量的值,其他线程能够立即知道这个修改
- 有序性:保证运行过程和原有的语义结构一致
- 符合happen-before原则可以保证有序性,包括
- 程序顺序原则,一个县城内保证语义的串行性
- volatile原则,volatile变量的写先发生于读
- 锁规则,解锁发生在加锁前
- 传递性,A先于B,B先于C,则A先于C
- 线程start优先于每个动作
- 线程所有操作优先于终结Join
- 线程中断优先于被中断的代码
- 对象构造函数执行优先于finalize()方法
- 符合happen-before原则可以保证有序性,包括