序
刚刚读完了这本书,写一个简单的读感
伊始
刚开始是受到推荐读了这本书,确实刚刚开始有些思想还是比较难理解的,不过反复度过几次之后也能慢慢的接受,这本书虽然版本有点老基本还是基于 jdk6、jdk7
进行讲解的,但思想是永不过时的。
并发问题的本质
在 Java
中所遇到的并发本质问题就在于如何合理和高效的进行线程间的通信,这一因素很重要,任何一个资源同一时间只能由一个线程拥有并且进行操作,同时在 Java
线程之间通信更是基于内存进行通信,线程读取自己的本地变量还好,如果是读取共有的操作变量,是需要通过内存进行交换的,内存信息又存在一个问题,一个线程获取这个信息的途径是从自己开始出发走到 CPU
然后在 CPU
各级缓存中去读取数据,如果这个时候不存在,麻烦的来了,就要去内存条中进行读取,涉及到的问题就是走总线进行读取耗时和直接读取耗时还有写的耗时,如何权衡利弊的均衡配置他们,合理分配,保证先后顺序。
顺序一致性内存模型
在并发中最高的理想就是顺序一致性内存模型,一个理想化的模型保证了任何的修改都能进行及时同步而且所有操作对所有的线程都能进行可见,显然这个是不太可能的一件时间,如果想要去拥有很高的一个并发,很多只能理论上推理保证个体持有元素是对全局可见,且预测变化。学习过程中接触了一个概念就是 happens-before
这个概念就是锁的一些设计哲学,任何的更改通过一个增加内存屏障的方式,保证了任何的写都对读的是可见的。后续深度了解各个内存语义之后,我再进行深入的读感撰写。
线程池的应用
线程池创建、执行方式和执行顺序就不说了,最令我感触深的是对线程池的刨析,他其实本质也是一个生产者-消费者的逻辑,不得不说他这个逻辑真的很优秀,集成在内部,你的所有输入都是提交任务,如果想获取输出就是通过 Futrue
的各个实现类去获取计算和执行结果。
延伸拓展到后面有多消费者多生产者的模式,其实本质都差不多,只不过是起更多的线程池去对应和依次的处理,书中还讲到比较重要的一点就是关于多线程池的好处是,通过构建不同的线程池一些线程池来处理密集型IO任务,而一些线程池来处理CPU密集型任务,中间的通信就是基于队列来进行通信,其实这整体下来,如果能足够抽象化的想象这个逻辑,很容易想到在 Go
中的协程间通信正是基于此,除了本身提供的 sync
包还有最推荐的正是基于channel
进行通信。
同时上述描述的这中模式,有一个Reactor模型
正是基于此,通过构建不同的两个线程池和中间的队列进行通信,整体的总结看下来,设计的哲学真的很重要,难得也是如何构建更加高效和可靠的处理方式,不停的进行处理时间,通信效率的处理。我想这本书总结了真的很多不错的经验和哲学,非常推荐读一读。