数据结构论坛

首页 » 分类 » 分类 » 设计模式与Java多线程的学习
TUhjnbcbe - 2021/8/6 23:04:00
白癜风丸副作用 https://m-mip.39.net/nk/mipso_4342725.html

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

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

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

设计模式

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

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

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

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

和Tomcat学设计模式

责任链模式及Filter的工作原理

和Tomcat学设计模式

模板方法模式

和Tomcat学设计模式

发布-订阅模式

和Tomcat学设计模式

Facade模式与请求处理

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

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

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

结构型模式

创建型模式

行为型模式

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

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

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

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

比如:

交给子类——TemplateMethod、FactoryMethod模式

生成实例——Singleton、Prototype模式

分开考虑——Bridge、Strategy模式

简单化——Facade、Mediator模式

管理状态——Observer、Memento模式

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

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

比如对于策略模式:

整体的替换算法

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

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

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

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

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

Java并发编程

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

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

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

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

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

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

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

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

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

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

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

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

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

大话ThreadLocal

Java并发编程相关概念及注意事项

白话描述并发编程重要概念

看Tomcat如何进行并发编程

END

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

图灵图解系列技术书

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

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

查看图灵图解系列图书。

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

图解设计模式

京东:

1
查看完整版本: 设计模式与Java多线程的学习