图片来源:pixabay.com
我面试Java程序员的时候,经常问的一个问题是:Singleton怎么写?今天,不少候选人仍然直接使用经典的两阶段校验(double check locking,DLC)来保证singleton的唯一,却看不出来会有问题。即便提示他们这样写有问题,他们也说不出来问题出在哪里。
答不出来也不要紧,因为这不是个别现象。“左耳听风”的作者陈浩就在一篇文章中说过,许多人写刷新缓存的程序,都是先删除缓存,然后更新数据库,等待后续访问“自然”把数据库里的最新值更新到缓存里。然而,这个逻辑也是错的。
这两个例子充分说明,并发编程的问题并不简单。看起来“顺理成章”的步骤,会因为同时存在多个实例而交错执行,看起来“浑然天成”的一步,其实可能包含了“中断-恢复”的过程,某些状态早已今非昔比——这有点像炒菜,正常流程是“洗锅-放油-热锅-下菜-放调料”,看起来是没问题,但并发环境下,可能等你把锅烧热,以为可以下菜了,却不知道锅已经被其他人换掉了,这时候继续往下走,当然会出错。
在缓存更新的例子中,许多人想当然认为,“删除缓存”和“更新数据库”就是浑然天成的,而没有想到其中有缝隙,在你把新值写入数据库之前,可能有其它线程发现缓存失效,于是从数据库中读取了尚未更新的值到缓存里……
按照我的经验,并发编程这回事,设计起来难免要绞尽脑汁。但这是必须的,否则生产环境里闹鬼的现象会层出不穷,调试起来则会生不如死。正因为如此,许多程序员都有“并发编程恐惧症”。它的具体表现是:对并发编程发怵,如果写了并发的程序,要么是盲目自负,要么是缺乏把握。在并发已经得到大规模应用的今天,这样的“并发恐惧症”实在是要不得。
当然,并发编程也不是毫无章法,而是有一定之规律。按照我的经验,必须理论和实践并重。要熟悉几类问题的原型,也要清楚实践中有哪些窍门,然后,大概会找到一些感觉了。
上面这张图的作者是资深架构师王宝令,涵盖了并发的三个核心问题:分工、互斥、协作,全面且系统地涵盖了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。