2020.7.26开始阅读学习 葛一鸣<<实战Java高并发程序设计>>
第一章 走入并行的世界
并行计算在图像处理和服务端编程有大量的使用
1.基本概念
1.1同步和异步 形容一次方法的调用
同步(Synchronous) 调用开始,调用者必须等待方法的返回,才能继续后续的行为 (例如:下馆子)
异步(Asynchronous) 调用开始,方法立即返回,调用者可以继续后续的操作.真正的方法执行是在另一个线程中,整个过程不会影响调用者的工作.(例如:点外卖)
1.2并发和并行 都表示两个或多个任务一起执行
并发(Concurrency) 侧重于多个任务交替执行,多任务之间可能还是串行执行
并行(Parallelism) 真正意义上的 同时执行 (更多是在多核情况下)
1.3临界区 表示公共资源(共享数据)
临界区 可以被多个线程使用,但是每次只能有一个线程使用,一旦临界区被占用,其他线程就必须等待.
2.并发级别
阻塞 使用 sychronized关键字或可重入锁 就是阻塞的线程 等待其他线程释放资源(释放锁) (悲观策略)
无饥饿 在线程有优先级, 线程调度倾向于优先级高的线程 .公平锁按顺序执行线程(无饥饿).非公平锁,允许优先级高的线程插队,其他优先级低的线程产生饥饿
无障碍 认为多个线程不会发生数据冲突,都可以无障碍的执行,如果检测有冲突就回滚数据(乐观策略)
无锁 在无障碍的基础上,保证至少有一个线程胜出,可能会出现无穷循环,会产生饥饿
无等待 在无锁的基础上,要求所有线程完成操作 不会产生饥饿 (只读的情况,所有线程都可以访问)
3.JMM (java 内存模型)
JMM的关键技术点都是围绕多线程的原子性,可见性,有序性建立的
原子性 Atomicity 一个操作不可中断
可见性 Visibility 一个线程修改了共享变量 其他线程能否立即知道这个修改
有序性 Ordering 习惯性任务代码的执行是从前往后执行的 但是操作系统(cpu)可能会进行指令重新排序执行代码
4.哪些指令不能重排 遵循Happen-Before规则
(JVM 规定先行发生原则,让一个操作无需控制就能先于另一个操作完成)
程序顺序原则 一个线程内保证语义的串行性 ( 单一线程原则 )
volatile规则 volatile 变量写先于读的发生,保证了volatile变量的可见性
锁规则 解锁(unlock)必然发生在后面的加锁(lock)前面 (管程锁定规则)
传递性 A先B ,B先C,A必然先C ()
线程的start()方法先于它的每个动作 (线程启动规则)
线程所有操作先于线程的终结Threa,join() (线程加入规则)
线程的中断interrupt() 先于被中断线程代码 (线程中断规则)
对象的构造函数执行,结束先于finalize()方法 (对象终结原则)