设计模式与Java多线程的学习

Posted 图灵教育

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式与Java多线程的学习相关的知识,希望对你有一定的参考价值。

在数据展示的时候,我们都知道,干巴巴的罗列数字,并不直观。如果有柱状、折线、饼图之类的对比图,做到数据可视化,则会一目了然。

在技术领域也一样,有些概念,都是开发经验丰富的「老司机」写出来,相当的浓缩,需要阅读者有相当的开发经验才能化得开,理解透彻。如果在技术内容中,能够像数据可视化一样,增加「饼图」,给我们画个饼,就更易于理解。可谓一图胜 千言啊。

今天我们推荐两本能给我们在技术内容之外「画饼」的书,便于吸收,一口气上五楼。 


设计模式


一直以来,在软件开发领域,有一些类似珍稀武功秘籍一样的内容,掌握之后,可以将软件设计得更优美,对于开发能更便于解耦和扩展,这其中之一就是「设计模式」。

此外,对于模式,在我们技术人员讨论方案,这个模式相当于一种共同可以理解的语言,说这里用个单例,那里需要代理,彼此即可意会。

也正因为通用,在软件开发中会经常看到设计模式,特别是开源软件盛行的今天,理解了设计模式,我们在阅读开源代码时,能更快地理解作者的设计意思,抓住脉络。

我在之前的几篇文章里写过 Tomcat 源代码中的设计模式使用,可以搭配着看。




我们最早听说设计模式估计都是从课堂上老师的口中,或者某些技术书籍中,类似于这里使用了工厂模式、那里使用了模板方法模式,其中有一个地方用到了策略模式等等。

说到这些模式之后,基本都会提到鼎鼎大名的 GoF——设计模式四人帮。正是这四个人将这一系列在软件开发中可能经常用到,又经过时间考验的模式提炼加工,并为之命名,成为我们今天看到的这常用的 23 种模式的样子。

以往我们提到设计模式,基本的划分方式都是按照 GoF 的分类:

  • 结构型模式

  • 创建型模式

  • 行为型模式

比如把 Factory、Singleton 归为创建型模式,把 Facade、 Adapter 归为结构型模式,把 Strategy、Template Method 等归为行为型模式。


GoF 的描述,相对比较精炼,需要反复阅读才能理解其中设计的精妙,或者需要有较丰富的 OOP 经验。

最近发现一本讲述设计模式的书图解设计模式》

这本书并没有沿袭 GoF 一直以来的模式划分方式,而是更细致地根据具体作用,将分类做了细化。

比如:

  • 交给子类—— Template Method、Factory Method 模式

  • 生成实例——  Singleton、Prototype 模式

  • 分开考虑—— Bridge、Strategy 模式

  • 简单化—— Facade、Mediator 模式

  • 管理状态—— Observer、Memento 模式

同时对于模式,初学者一直的困扰是「这都是啥?」根据名字并不能直观地理解这个模式大致的意图。这个在书中也都给一一做了简要描述。

在《图解设计模式》一书中,对每个模式都会有一个形象的图来概括这个模式,同时还有一句简短且易于理解的句子来描述模式。

比如对于策略模式:


整体的替换算法


通过这句描述可以比 Strategy 能更好地理解模式背后的意思吧?在讲解模式时,还有一小段文字来详细的描述。另外,再辅以下方在不同情况下适配的不同插头,很形象。

设计模式与Java多线程的学习


在对模式的讲解中,会先通过软件开发的「通用语言」- UML 图来展示,在这之后会有具体的代码。代码之外,作者的书还有一个特点:

将模式中各个涉及到的类抽象为「角色」。就像影视剧一样,通过角色来理解剧情,而不是仅着眼于具体的示例代码,不能做到活学活用。

同时,每个模式最后,会有「拓展思路的要点」和「相关的设计模式」两部分内容。第一部分相当于追问使用之后有哪些优势及劣势,第二部分则会对比类似的模式。

当然,对于模式的学习,正如作者在书中所说,不能只看书里的案例,还要自己思考一些案例,同时理解模式中对应的角色,通过抽象的角色来面对模式适用的不同场景,将模式化用到设计与编程中。



Java并发编程


坦白地说,对于任何编程语言来说,多线程编程都不是个容易学的内容。这源于多线程编程的复杂性。

方法的互斥,内存的可见性、线程的切换与优先级、死锁、甚至环境的复杂与隐蔽等,有些单线程处理正常的程序,放到多线程环境中会有各种各样的问题。问题产生后还难以复现。

但多线程又是一个不得不面对的问题,机器硬件性能越来越高,核越来越多,相应的软件却没有利用起来,岂不是暴殄天物!

在 Java 并发编程方面,一直以来神书是 Brian Goetz 的《Java并发编程实战》。此外就是已经绝版的 Doug Lea 的著作。

那对于信息量不小的 Java 并发编程,往往每个概念都会让人望而却步。比如 Java 内存模型(JMM),比如 volatile 如何影响可见性与指令重排序,什么是 Happens-Before,如何应用线程池,wait 与 notify 是如何工作的,如何分别针对读与写的线程进行优化?

设计模式与Java多线程的学习


关于内存可见性,如果有这样一张图,会不会清晰明了呢?我们看到 volatile 在读写时,两只小眼睛一直盯着共享内存中的数据,不受缓存的干扰。

设计模式与Java多线程的学习


这里推荐的是与前面的《图解设计模式》同一作者的书图解Java多线程设计模式,通过模式的方式来讲述 Java 并发编程。

设计模式与Java多线程的学习

讲述风格同前面的书一致,依然是一图胜千言。

比如读写锁,写的线程就会被阻塞,等待锁:

设计模式与Java多线程的学习


对于并发涉及到的关键「人物」,也通过模式中的「角色」来描述:

设计模式与Java多线程的学习


书中除通过模式讲解并发知识外,在每个模式后,会有「扩展阅读」部分,描述这些内容在 JDK 里是怎样实现的。

对于多线程最重要的是理解这背后的一系列概念,从而在使用多线程时不至于出错——在需要互斥时候并没有锁,需要保证内存可见性进行线程状态的控制时,仅仅用了一个普通变量,忘记了volatile,在使用线程池时没有理解 Worker Thread 的原理,都会导致问题。 而理解了这些内容,才能避免怪异的问题,减少为此加班  :) 。

关于并发,我在之前的文章里也写过一些:






END


文章转载自『 Tomcat那些事儿  』 

设计模式与Java多线程的学习



图灵图解系列技术书

图灵日系 [ 图解X ] 技术入门书,因其文笔简练、深入浅出、多图表、形象生动的风格深得程序员喜爱。加上日本作者极为细腻的叙事风格,图灵翻译方面的良好保障,这一系列已经成为程序员快速了解相应领域的首选参考书。

到目前为止,这个书单共包括 13 本书。图解系列图书作者都是日本知名技术人士,比如《图解设计模式》的作者是大家非常熟悉的结城浩桑,很多读者应该读过他写的《程序员的数学》《图解密码技术》《数学女孩》......只能说,他写的书实在是太好了!

阅读原文】查看图灵图解系列图书。

如果你喜欢这两本图书,如下购买方式:

图解设计模式

京东:https://item.jd.com/12019365.html

当当:http://product.dangdang.com/24157561.html


图解Java多线程

京东:https://item.jd.com/12165317.html

当当:http://product.dangdang.com/25153039.html


唠两句

这点儿有活跃的不?今天被这两本书中的设计模式漫画图萌化了,越来越粉结城浩大大了。有读完这两本书的读者吗?你觉得我们今天的推送涉及几种设计模式?今天就送 1 本书吧,这两本书都没样书可送了... 明天中午就选出这位读者。


【阅读原文】查看图灵图解系列图书

以上是关于设计模式与Java多线程的学习的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程与并发---学习总结(很详细)

每周一书《图解Java多线程设计模式》分享!

201771010126 王燕《面向对象程序设计(Java)》第十七周学习总结

一图胜千言|谈谈设计模式与Java多线程的学习 | 文末送书

JAVA多线程与并发学习总结

20175120彭宇辰 《Java程序设计》第十周学习总结