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

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

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

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

设计模式

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

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

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

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

和Tomcat学设计模式 | 责任链模式及Filter的工作原理

和Tomcat学设计模式 | 模板方法模式

和Tomcat学设计模式 | 发布-订阅模式

和Tomcat学设计模式 | Facade模式与请求处理

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

说到这些模式之后,基本都会提到鼎鼎大名的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能更好的理解模式背后的意思吧。在详细讲解模式时,还有一小段文字来详细的描述。另外,再辅以下方在不同情况下适配的不同插头。很形象。

在对模式的讲解中,会先通过软件开发的「通用语言」- UML 图来展示。

在这之后会有具体的代码。

代码之外,作者的书还有一个特点:

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

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

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

Java并发编程

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

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

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

在Java并发编程方面,一直以来神书是Brian Goetz的「Java并发编程实战」。

此外就是已经绝版的Doug Lea 的著作。

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

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

今天推荐一本与前面「图解设计模式」同一作者的书「图解Java多线程设计模式」,通过模式的方式来讲述Java并发编程。

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

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

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

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

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

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

大话ThreadLocal

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

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

看Tomcat如何进行并发编程

送书

感谢人民邮电出版社图灵教育的支持。

本次将送出上述推荐书,共计5本,感谢各位读者一直以来的支持与关注。

我们参与方式如下:

在本文下方留言描述你对于技术的学习过程、总结与感悟、工作中踩过的坑,看过的好书与收获等等,截止时间 5月13日 18:00 ,留言点赞的前三名送书。

另外的两本,知识星球星友送一本,一直赞赏支持的读者送一本。名单会在下周一(5月14日)公布。

文中相关书籍图片源于书籍,归版权方所有。

历史热文汇总,请看:

「Tomcat那些事儿」历史热文分类汇总

觉得本文对你有帮助?请分享给更多人支持一下,谢谢

关注『 Tomcat那些事儿  』 ,发现更多精彩文章!了解各种常见问题背后的原理与答案。深入源码,分析细节,内容原创,欢迎关注。

加入知识星球,一起进步

更多精彩内容:

一台机器上安装多个Tomcat 的原理(回复001)

监控Tomcat中的各种数据 (回复002)

启动Tomcat的安全机制(回复003)

乱码问题的原理及解决方式(回复007)

Tomcat 日志工作原理及配置(回复011)

web.xml 解析实现(回复 012)

线程池的原理( 回复 014)

Tomcat 的集群搭建原理与实现 (回复 015)

类加载器的原理 (回复 016)

类找不到等问题 (回复 017)

代码的热替换实现(回复 018)

Tomcat 进程自动退出问题 (回复 019)

为什么总是返回404? (回复 020)

...

PS: 对于一些 Tomcat常见问题,在公众号的【常见问题】菜单中,有需要的朋友欢迎关注查看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值