• 并发产生的原因
○ 可见性
○ 原子性
○ 有序性
• CPU
○ ALG/寄存器/高速缓存
○ 基于CPU模型分析并发问题原因
○ 分时复用CPU
○ CPU指令流水线优化
○ 时间/空间局部性原理
• Java内存模型
○ volatile顺序性
○ volatile写先于读
○ volatile传递性
○ 锁-写先于读
○ Start
○ Join
• Volatile
○ 禁用CPU缓存
○ 禁用指令重排序
• 锁
○ Synchronized
§ 三种用法
§ Wait/notify/notifyAll
§ while范式
○ ReentrantLock
○ LockSupport
§ LockSupport.unpark(Thread thread)
§ LockSupport.park()
• 死锁
○ 四个条件
○ 四个破法
• 多线程三个问题
○ 安全性问题
○ 活跃性问题
§ 活锁和饥饿
○ 性能
§ 阿姆达尔定律
§ 无锁技术
□ ThreadLocal
□ CAS
□ 乐观锁
§ 减少锁持有的时间
• 管程模型
○ 
• 线程生命周期
○ 操作系统线程
§ 初始状态/可运行状态/休眠状态/运行状态/终止状态
§ 休眠状态会释放CPU使用权,当等待事件出现了,才会变为可运行状态。
○ Java线程
§ NEW/RUNNABLE/BLOCKED/WAITING/TIMED_WAITING/TERMINATED
§ BLOCKED/WAITING/TIMED_WAITING 和操作系统的休眠状态一致。
§ Java中RUNNABLE并不区分是否被CPU分配时间片执行。它全权交给操作系统去处理了。
§ 可以使用JConsole或者Jstack来查看线程状态,检查死锁
• 创建多少线程合适
○ 多线程主要就是提高IO和CPU的综合利用率,充分利用硬件。
○ CPU密集型
§ 因为是纯CPU运行,多少核就创建【核数+1】是最快的,再创建也只是增加线程切换的成本。
○ IO密集型
§ 最佳线程数 =CPU 核数 * [ 1 +(I/O 耗时 / CPU 耗时)]
§ 实际可以在测试中对服务器IO和CPU使用率做监控。
• 并发工具类
○ ReentrantLock
○ Semaphore
○ ReadWriteLock
○ StempedLock
○ CountDownLatch/CyclicBarrier
○ 并发容器
§ CopyOnWriteArrayList
□ 在写入数据的时候,会Copy出一个数组,用于读,所以没有并发,但是读写会短暂不一致。
§ ConcurrentHashMap
§ ConcurrentSkipListMap
□ 跳表,有序
§ CopyOnWriteArraySet
§ ConcurrentSkipListSet
§ Queue
□ ArrayBlockingQueue
□ LinkedBlockingQueue
□ SynchronousQueue
□ LinkedTransferQueue
□ PriorityBlockingQueue
□ DelayQueue
○ 无锁
§ CPU支持CAS指令,作为一条CPU指令,本身能保证原子性。
§ CAS范式 do {oldV = xxxx;newV = ...oldV...}while(!compareAndSet(oldV,newV);
§ ABA问题
§ 原子类概览->

§ 优缺点:性能好,不会死锁,但会饥饿和活锁(自旋会反复重试),仅限于单个变量、引用、值的原子操作。
○ 线程池
§ 线程池生命周期与ThreadPoolExecutor的7个参数
§ 让你自己设计一个线程池你要如何设计
§ 生产者-消费者模式
§ 自定义阻塞策略:Caller去执行、抛异常、丢任务、丢最老的任务。
§ 从线程池获取执行结果:三个Submit方法使用、Future接口使用、FutureTask使用