聊聊“并发编程恐惧症”

2019 年 2 月 25 日 余晟以为

图片来源:pixabay.com

我面试Java程序员的时候,经常问的一个问题是:Singleton怎么写?今天,不少候选人仍然直接使用经典的两阶段校验(double check locking,DLC)来保证singleton的唯一,却看不出来会有问题。即便提示他们这样写有问题,他们也说不出来问题出在哪里。

//你看出问题在哪里了吗?
class SomeClass { private Resource resource = null; public Resource getResource() { if (resource == null) { synchronized { if (resource == null) resource = new Resource(); } } return resource; } }

//要知道答案,请参考 http://t.cn/EfK7IyX

答不出来也不要紧,因为这不是个别现象。“左耳听风”的作者陈浩就在一篇文章中说过,许多人写刷新缓存的程序,都是先删除缓存,然后更新数据库,等待后续访问“自然”把数据库里的最新值更新到缓存里。然而,这个逻辑也是错的。

这两个例子充分说明,并发编程的问题并不简单。看起来“顺理成章”的步骤,会因为同时存在多个实例而交错执行,看起来“浑然天成”的一步,其实可能包含了“中断-恢复”的过程,某些状态早已今非昔比——这有点像炒菜,正常流程是“洗锅-放油-热锅-下菜-放调料”,看起来是没问题,但并发环境下,可能等你把锅烧热,以为可以下菜了,却不知道锅已经被其他人换掉了,这时候继续往下走,当然会出错。

在缓存更新的例子中,许多人想当然认为,“删除缓存”和“更新数据库”就是浑然天成的,而没有想到其中有缝隙,在你把新值写入数据库之前,可能有其它线程发现缓存失效,于是从数据库中读取了尚未更新的值到缓存里……

按照我的经验,并发编程这回事,设计起来难免要绞尽脑汁。但这是必须的,否则生产环境里闹鬼的现象会层出不穷,调试起来则会生不如死。正因为如此,许多程序员都有“并发编程恐惧症”。它的具体表现是:对并发编程发怵,如果写了并发的程序,要么是盲目自负,要么是缺乏把握。在并发已经得到大规模应用的今天,这样的“并发恐惧症”实在是要不得。

当然,并发编程也不是毫无章法,而是有一定之规律。按照我的经验,必须理论和实践并重。要熟悉几类问题的原型,也要清楚实践中有哪些窍门,然后,大概会找到一些感觉了。

上面这张图的作者是资深架构师王宝令,涵盖了并发的三个核心问题:分工、互斥、协作,全面且系统地涵盖了Java并发编程的技术难点。

如果你能看懂上面这张图,也觉得有道理,不妨考虑他在极客时间推出的《Java并发编程实战》课程。


王宝令是谁?


王宝令,资深架构师,目前在京东从事电商架构设计工作。他前前后后写了15年的程序,曾任职于用友、金蝶、惠普、东软等公司,设计研发了支持高并发的API网关、数据库连接池以及海量数据归档平台。


宝令自己说,起初,他对于写这个专栏是心存疑问的,因为市面上已经有很多这方面的书了。但后来,他发现大家对并发的盲点,有时涉及对操作系统的理解,有时又涉及一点硬件知识,非常复杂。如果要推荐相关图书,可能要推荐好几本,有点“大炮打蚊子”的感觉,效率很差。同时图书更追求严谨性,也因此失掉了形象性,大家阅读的过程就会比较艰辛。


于是有了这个专栏《Java并发编程实战》,就是为了解决上面的问题。


这个专栏有什么特色?


1、非常落地,带你掌握解决并发问题的关键


看了目录,这个专栏分别用了一整个模块的内容来讲解12 个Java并发工具类,及9 种最常见的并发设计模式。


比如Java SDK并发包,它提供了非常丰富的功能,但对于初学者来说可谓是眼花缭乱,好多人觉得无从下手。宝令会探讨Java SDK里的12个主流并发工具类,包含隐藏在并发包中的管程,以及如何使用,还有详细解读信号量、读写锁、CountDownLatch和CyclicBarrier等等内容。


还有就是并发设计模式,它是解决并发问题最佳实践的总结,必然是重中之重的内容。前3种设计模式的核心思想是避免共享变量,从而避免并发问题;后面6种设计模式则都属于典型的分工模式。宝玉都会一一详解,让大家搞懂并掌握解决并发问题的关键。


2、专栏后面的「四大经典并发编程实战案例解析」,是即学即用的典范


这4个经典的开源框架分别是:高性能限流器Guava RateLimiter、高性能网络应用框架Netty、高性能队列Disruptor和高性能数据库连接池HiKariCP,让你从案例中根本性地了解如何处理并发问题。通过这4个案例的学习,你绝对会对如何解决并发问题有更深入的认识。


吸收他人的经验,提高自己“解决问题”的能力,无疑是个人成长和提升职场竞争力的最快方式。


在这里订阅有什么福利?


1. 专栏在上新优惠期,限时优惠¥68(原价¥99),一箱「肥宅快乐水」的价格就可以获取宝令十余年的技术沉淀,深入Java更底层。


2. 订阅用户在留言区说出你学习「Java并发编程」的原因,点赞前 3 名粉丝可获得极客时间68元任意课程一个,活动截止2月27日24:00。

登录查看更多
1

相关内容

人们为了让计算机解决各种棘手的问题,使用编程语言 编写程序代码并通过计算机运算得到最终结果的过程。
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
57+阅读 · 2020年6月26日
FPGA加速系统开发工具设计:综述与实践
专知会员服务
65+阅读 · 2020年6月24日
【实用书】Python技术手册,第三版767页pdf
专知会员服务
234+阅读 · 2020年5月21日
Python导论,476页pdf,现代Python计算
专知会员服务
259+阅读 · 2020年5月17日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
161+阅读 · 2020年5月14日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
117+阅读 · 2020年5月10日
《代码整洁之道》:5大基本要点
专知会员服务
49+阅读 · 2020年3月3日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
95+阅读 · 2019年12月4日
前端微服务在字节跳动的落地之路
前端之巅
41+阅读 · 2019年9月19日
在K8S上运行Kafka合适吗?会遇到哪些陷阱?
DBAplus社群
9+阅读 · 2019年9月4日
说说我的老同事,前端大神程劭非
余晟以为
17+阅读 · 2019年1月14日
百万年薪AI工程师思维导图及书单
七月在线实验室
37+阅读 · 2018年5月25日
刚开始学编程?这几款小工具能让你事半功倍
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
十五条有用的Golang编程经验
CSDN大数据
5+阅读 · 2017年8月7日
Knowledge Flow: Improve Upon Your Teachers
Arxiv
5+阅读 · 2019年4月11日
Efficient and Effective $L_0$ Feature Selection
Arxiv
5+阅读 · 2018年8月7日
Arxiv
6+阅读 · 2018年1月14日
Arxiv
3+阅读 · 2017年10月1日
VIP会员
相关VIP内容
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
57+阅读 · 2020年6月26日
FPGA加速系统开发工具设计:综述与实践
专知会员服务
65+阅读 · 2020年6月24日
【实用书】Python技术手册,第三版767页pdf
专知会员服务
234+阅读 · 2020年5月21日
Python导论,476页pdf,现代Python计算
专知会员服务
259+阅读 · 2020年5月17日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
161+阅读 · 2020年5月14日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
117+阅读 · 2020年5月10日
《代码整洁之道》:5大基本要点
专知会员服务
49+阅读 · 2020年3月3日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
95+阅读 · 2019年12月4日
相关资讯
前端微服务在字节跳动的落地之路
前端之巅
41+阅读 · 2019年9月19日
在K8S上运行Kafka合适吗?会遇到哪些陷阱?
DBAplus社群
9+阅读 · 2019年9月4日
说说我的老同事,前端大神程劭非
余晟以为
17+阅读 · 2019年1月14日
百万年薪AI工程师思维导图及书单
七月在线实验室
37+阅读 · 2018年5月25日
刚开始学编程?这几款小工具能让你事半功倍
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
十五条有用的Golang编程经验
CSDN大数据
5+阅读 · 2017年8月7日
Top
微信扫码咨询专知VIP会员