文章目录
1.概述
看完这本书 看看meter的实现逻辑
1.1. 走进并行世界
忘掉并行、摩尔定律
并发与并行的区别,这个讲的好。
多线程死锁、活锁
amdahl定律
32位long类型的数据读取不是原子性的。
指令重排与happen-Before原则。
1.2 java并行程序基础
主要讲解了线程相关的内容,以及一些重要的关键字,可以一看。
1.3 jdk并发包
本章由浅入深,讲解的非常好,逐步深入,很适合,初学者以及第二次观看
同步控制
- 讲解了synchronized 关键字的使用
- 重入锁的好搭档,condition 和object的wait很像
- 讲解了信号量,相当于同时进入临界区的个数限制
- 讲解了读写锁的分离思想以及性能测试
- 倒数计数器,火箭发射程序
- 循环栅栏 军队队伍集合案例
- 现场阻塞工具lockSupport的使用
- guava的限流 RateLimiter
线程池讲解
- 什么是线程池
- jdk的已有线程池介绍以及不好的地方
- 线程池内部实现ThreadLocalPool
- 拒绝策略介绍,以及自定义拒绝策略
- 扩展线程池,执行方法之前 执行之后的AOP
- 线程池大小的设置公式
- 自定义线程池打印现场堆栈信息(这个很重要)
- fork join框架 ForkJoinPool
- guava中线程池的扩展
jdk并发容器
- hashmap list currentHashMap CopyOnWriteArrayLisy
- BlockingQueue
- 数据有序性的跳表 (有用)
JMH性能测试
- 工具介绍以及使用
1.4 锁的优化以及注意事项
一些建议
- 减少锁持有时间
- 减小锁粒度 currentHashMap 分段锁
- 用读写分离锁代替独占锁
- 锁分离,ArrayBlockingQueue take()方法是从头部取数据,而put()方法是从尾部放数据,这两个是互不干扰的,不应该用一个锁。
- 锁粗化 将for循环中的锁提到for循环之外
java虚拟机对锁优化所做的努力
- 偏向锁,第一个获取锁的线程,下次请求还是获取锁,无同步,锁竞争激烈的时候,效果不好
- 轻量级锁,将对象头部作为指针,指向持有锁的线程堆栈的内部,来判断一个线程是否持有对象锁。如果加锁失败,则膨胀为重量级锁。
- 自旋锁,虚拟机最后的努力,空循环几个周期,万一线程自己获取了锁呢
- 锁消除,有意或者无意引入的锁,虚拟机根据逃逸分析,如果安全,那么就会消除锁
threadLocal 介绍
- threadLocalMap 在线程退出的时候会清理,建议主动设置null ,防止内存泄漏
无锁
- cas 循环,一旦检测到冲突产生,就重试当前操作直到没有冲突为止
- 无锁没有锁竞争带来的系统开销,也没有线程间平凡调度带来的开销
- 大部分现代化处理器都支持原子化的CAS指令
- 无锁的 AtomicInteger
- java中的指针 Unsafe类 简单介绍,并没有深入讲解
- 无锁的引用对象,AtomicReference 对普通的对应引用,可以保证你在修改对象引用时的线程安全性 有ABA的问题
- 带有时间戳的对象引用 AtomicStampedReference 解决对象在修改过程中丢失状态。
- 数组也能无锁,AtomicIntegerArray
- 让普通变量也享受原子操作 AtomicIntegerFieldUpdater 这个讲的比较好,但是不常用,我浏览了一下,没仔细看
- 线程之间互帮互助,Synchronous 容量为0,任何一个对Synchronous的写需要等待一个对Synchronous的读操作。后续讲解了源码相关的,比较深入,可以一看。
有关死锁的问题
- 哲学家进餐问题,没有深度
1.5 并行模式与算法
单例模式
不变模式
- java String 类型
生产者消费者模式
无锁缓存框架 disruptor
- 一个案例 没怎么仔细看
cpu cache 优化,解决伪共享的问题
- 一堆long 占用64个字节,正好是一个数据块,这个我写过博客
feature 模式
- 自定义feature模式
下面是排序算法,没怎么看
网络NIO
nio相关案例,没怎么看,代码太多
1.6 java 8 9 10与并发
函数作为一等公民
函数式编程基础
- FunctionalInterface 注解
- lambda表达式
增强的Future:CompletableFuture
- CompletableFuture 实现了 Futureje接口,也实现了 CompletionStage接口(40多个方法)
- 支持超时时间
读写锁的改进 StampedLock
- 读写锁虽然分离了读和谐的功能,但是读锁会完全阻塞写锁。
- StampedLock的内部实现是基于CLH锁的,CLH锁是一种自旋锁,它保证没有饥饿发生,并且可以保证FIFO的服务顺序。
- 基本思想:锁维护一个等待线程队列,所有申请锁但是没有成功的线程都记录在这个队列中,每个节点(一个节点代表一个线程)保存一个标记为(locked)用于判断当前线程是否已经释放了锁。
- 关于原理讲解的这点没仔细看
原子类增强
- 更快的原子类 LongAdder
- currentHashMap的增强,map.compyteIfAbsent
发布和订阅模式
- java 9 反应式编程,反映社编程用于处理异步流中的数据,每当应用收到数据项,便会对它进行处理,反应式编程以流的形式处理数据,因此在内存中使用效率更高。因为是jdk 9的简单看看,没有了解,因为jdk8还会持续很长一段时间。
1.7 使用akka构建高并发程序
因为学习了netty,akka能做的,netty也能做,netty能做的,akka不能做,所以这一章我是直接跳过的,因为没机会用到,专心搞netty就好了。
1.8 并行程序调试
这一章没啥好看的,讲解的主要是eclipse的调试,和IDEA没关系,而且早就不用eclipse了,因为跳过。关于调试的这点我还是懂一点的。
而且本章内容很多,看看也无妨,我就是大概浏览了一下。
1.9 jetty核心代码分析
因为不用,所以没看