【读书笔记】实战Java高并发程序设计(第2版)读书笔记


在这里插入图片描述

1.概述

看完这本书 看看meter的实现逻辑

1.1. 走进并行世界

忘掉并行、摩尔定律
并发与并行的区别,这个讲的好。
多线程死锁、活锁
amdahl定律
32位long类型的数据读取不是原子性的。
指令重排与happen-Before原则。

1.2 java并行程序基础

主要讲解了线程相关的内容,以及一些重要的关键字,可以一看。

1.3 jdk并发包

本章由浅入深,讲解的非常好,逐步深入,很适合,初学者以及第二次观看

同步控制

  1. 讲解了synchronized 关键字的使用
  2. 重入锁的好搭档,condition 和object的wait很像
  3. 讲解了信号量,相当于同时进入临界区的个数限制
  4. 讲解了读写锁的分离思想以及性能测试
  5. 倒数计数器,火箭发射程序
  6. 循环栅栏 军队队伍集合案例
  7. 现场阻塞工具lockSupport的使用
  8. guava的限流 RateLimiter

线程池讲解

  1. 什么是线程池
  2. jdk的已有线程池介绍以及不好的地方
  3. 线程池内部实现ThreadLocalPool
  4. 拒绝策略介绍,以及自定义拒绝策略
  5. 扩展线程池,执行方法之前 执行之后的AOP
  6. 线程池大小的设置公式
  7. 自定义线程池打印现场堆栈信息(这个很重要)
  8. fork join框架 ForkJoinPool
  9. guava中线程池的扩展

jdk并发容器

  1. hashmap list currentHashMap CopyOnWriteArrayLisy
  2. BlockingQueue
  3. 数据有序性的跳表 (有用)

JMH性能测试

  1. 工具介绍以及使用

1.4 锁的优化以及注意事项

一些建议

  1. 减少锁持有时间
  2. 减小锁粒度 currentHashMap 分段锁
  3. 用读写分离锁代替独占锁
  4. 锁分离,ArrayBlockingQueue take()方法是从头部取数据,而put()方法是从尾部放数据,这两个是互不干扰的,不应该用一个锁。
  5. 锁粗化 将for循环中的锁提到for循环之外

java虚拟机对锁优化所做的努力

  1. 偏向锁,第一个获取锁的线程,下次请求还是获取锁,无同步,锁竞争激烈的时候,效果不好
  2. 轻量级锁,将对象头部作为指针,指向持有锁的线程堆栈的内部,来判断一个线程是否持有对象锁。如果加锁失败,则膨胀为重量级锁。
  3. 自旋锁,虚拟机最后的努力,空循环几个周期,万一线程自己获取了锁呢
  4. 锁消除,有意或者无意引入的锁,虚拟机根据逃逸分析,如果安全,那么就会消除锁

threadLocal 介绍

  1. threadLocalMap 在线程退出的时候会清理,建议主动设置null ,防止内存泄漏

无锁

  1. cas 循环,一旦检测到冲突产生,就重试当前操作直到没有冲突为止
  2. 无锁没有锁竞争带来的系统开销,也没有线程间平凡调度带来的开销
  3. 大部分现代化处理器都支持原子化的CAS指令
  4. 无锁的 AtomicInteger
  5. java中的指针 Unsafe类 简单介绍,并没有深入讲解
  6. 无锁的引用对象,AtomicReference 对普通的对应引用,可以保证你在修改对象引用时的线程安全性 有ABA的问题
  7. 带有时间戳的对象引用 AtomicStampedReference 解决对象在修改过程中丢失状态。
  8. 数组也能无锁,AtomicIntegerArray
  9. 让普通变量也享受原子操作 AtomicIntegerFieldUpdater 这个讲的比较好,但是不常用,我浏览了一下,没仔细看
  10. 线程之间互帮互助,Synchronous 容量为0,任何一个对Synchronous的写需要等待一个对Synchronous的读操作。后续讲解了源码相关的,比较深入,可以一看。

有关死锁的问题

  1. 哲学家进餐问题,没有深度

1.5 并行模式与算法

单例模式

不变模式

  1. java String 类型

生产者消费者模式

无锁缓存框架 disruptor

  1. 一个案例 没怎么仔细看

cpu cache 优化,解决伪共享的问题

  1. 一堆long 占用64个字节,正好是一个数据块,这个我写过博客

feature 模式

  1. 自定义feature模式

下面是排序算法,没怎么看

网络NIO
nio相关案例,没怎么看,代码太多

1.6 java 8 9 10与并发

函数作为一等公民

函数式编程基础

  1. FunctionalInterface 注解
  2. lambda表达式

增强的Future:CompletableFuture

  1. CompletableFuture 实现了 Futureje接口,也实现了 CompletionStage接口(40多个方法)
  2. 支持超时时间

读写锁的改进 StampedLock

  1. 读写锁虽然分离了读和谐的功能,但是读锁会完全阻塞写锁。
  2. StampedLock的内部实现是基于CLH锁的,CLH锁是一种自旋锁,它保证没有饥饿发生,并且可以保证FIFO的服务顺序。
  3. 基本思想:锁维护一个等待线程队列,所有申请锁但是没有成功的线程都记录在这个队列中,每个节点(一个节点代表一个线程)保存一个标记为(locked)用于判断当前线程是否已经释放了锁。
  4. 关于原理讲解的这点没仔细看

原子类增强

  1. 更快的原子类 LongAdder
  2. currentHashMap的增强,map.compyteIfAbsent

发布和订阅模式

  1. java 9 反应式编程,反映社编程用于处理异步流中的数据,每当应用收到数据项,便会对它进行处理,反应式编程以流的形式处理数据,因此在内存中使用效率更高。因为是jdk 9的简单看看,没有了解,因为jdk8还会持续很长一段时间。

1.7 使用akka构建高并发程序

因为学习了netty,akka能做的,netty也能做,netty能做的,akka不能做,所以这一章我是直接跳过的,因为没机会用到,专心搞netty就好了。

1.8 并行程序调试

这一章没啥好看的,讲解的主要是eclipse的调试,和IDEA没关系,而且早就不用eclipse了,因为跳过。关于调试的这点我还是懂一点的。

而且本章内容很多,看看也无妨,我就是大概浏览了一下。

1.9 jetty核心代码分析

因为不用,所以没看

猜你喜欢

转载自blog.csdn.net/qq_21383435/article/details/114693378