博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么需要学习并发编程?
阅读量:1957 次
发布时间:2019-04-27

本文共 1862 字,大约阅读时间需要 6 分钟。

并发编程的掌握过程并不容易。我相信为了解决这个问题,你也听别人总结过并发编程的第一原则,那就是不要写并发程序。这个原则在我刚毕业的那几年曾经是行得通的,那个时候多核服务器还是一种奢侈品,系统的并发量也很低,借助数据库和类似Tomcat这种中间件,我们基本上不用写并发程序。或者说,并发问题基本上都被中间件和数据库解决了。

但是最近几年,并发编程已经慢慢成为一项必备技能。

这主要是硬件的驱动以及国内互联网行业的飞速发展决定的,现在64核的服务器已经飞入寻常百姓家,大型互联网厂商的系统并发量轻松过百万,传统的中间件和数据库已经不能为我们遮风挡雨,反而成了瓶颈所在。

于是,并发编程最近几年成为非常热门的领域,人才稀缺。但与此同时,关于并发编程的书籍也渐渐丰富起来了。所以当极客时间团队和我聊这个专栏的时候,我的第一个疑问就是目前市面上已经有很多这方面的图书了,而且很多都非常优秀,是否还有必要搞一个这样的专栏。

但是深入想过之后,我坚定了写作的信心。这些年接触的大部分同学,都是工作几年后很多技术突飞猛进,却只有并发编程成为瓶颈,虽然并发相关的类库他们也熟悉,却总是写不出正确、高效的并发程序,原因在哪里?我发现很多人是因为某个地方有了盲点,忽略了一些细节,但恰恰是这些细节决定了程序的正确性和效率。

而这个盲点有时候涉及对操作系统的理解,有时候又涉及一点硬件知识,非常复杂,如果要推荐相关图书,可能要推荐好几本,这就有点“大炮打蚊子”的感觉了,效率很差。同时图书更追求严谨性,却也因此失掉了形象性,所以阅读的过程也确实有点艰辛。

我想,如果能够把这些问题解决,那么做这个事情应该是有意义的。

例如,Java里synchronized、wait()/notify()相关的知识很琐碎,看懂难,会用更难。但实际上synchronized、wait()、notify()不过是操作系统领域里管程模型的一种实现而已,Java SDK并发包里的条件变量Condition也是管程里的概念,synchronized、wait()/notify()、条件变量这些知识如果单独理解,自然是管中窥豹。但是如果站在管程这个理论模型的高度,你就会发现这些知识原来这么简单,同时用起来也就得心应手了。

管程作为一种解决并发问题的模型,是继信号量模型之后的一项重大创新,它与信号量在逻辑上是等价的(可以用管程实现信号量,也可以用信号量实现管程),但是相比之下管程更易用。而且,很多编程语言都支持管程,搞懂管程,对学习其他很多语言的并发编程有很大帮助。然而,很多人急于学习Java并发编程技术,却忽略了技术背后的理论和模型,而理论和模型却往往比具体的技术更为重要。

此外,Java经过这些年的发展,Java SDK并发包提供了非常丰富的功能,对于初学者来说可谓是眼花缭乱,好多人觉得无从下手。但是,Java SDK并发包乃是并发大师Doug Lea出品,堪称经典,它内部一定是有章可循的。那它的章法在哪里呢?

其实并发编程可以总结为三个核心问题:分工、同步、互斥。

所谓分工指的是如何高效地拆解任务并分配给线程,而同步指的是线程之间如何协作,互斥则是保证同一时刻只允许一个线程访问共享资源。Java SDK并发包很大部分内容都是按照这三个维度组织的,例如Fork/Join框架就是一种分工模式,CountDownLatch就是一种典型的同步方式,而可重入锁则是一种互斥手段。

当把并发编程核心的问题搞清楚,再回过头来看Java SDK并发包,你会感觉豁然开朗,它不过是针对并发问题开发出来的工具而已,此时的SDK并发包可以任你“盘”了。

而且,这三个核心问题是跨语言的,你如果要学习其他语言的并发编程类库,完全可以顺着这三个问题按图索骥。Java SDK并发包其余的一部分则是并发容器和原子类,这些比较容易理解,属于辅助工具,其他语言里基本都能找到对应的。

所以,你说并发编程难学吗?

首先,难是肯定的。因为这其中涉及操作系统、CPU、内存等等多方面的知识,如果你缺少某一块,那理解起来自然困难。其次,难不难学也可能因人而异,就我的经验来看,很多人在学习并发编程的时候,总是喜欢从点出发,希望能从点里找到规律或者本质,最后却把自己绕晕了。

我前面说过,并发编程并不是Java特有的语言特性,它是一个通用且早已成熟的领域。Java只是根据自身情况做了实现罢了,当你理解或学习并发编程的时候,如果能够站在较高层面,系统且有体系地思考问题,那就会容易很多。

转载地址:http://exfsf.baihongyu.com/

你可能感兴趣的文章
Oracle裁员,3点建议
查看>>
「忙」只是借口
查看>>
如果只有1小时学Python,看这篇就够了
查看>>
命名难,难于上青天
查看>>
记一件小事
查看>>
一个牛逼的数据库操作命令行工具:mycli
查看>>
掌握 Python 爬虫的所有技巧,都在这里!
查看>>
史上最烂项目:苦撑12年,600多万行代码...
查看>>
关于进程与线程,史上最浅显易懂的一个简单解释
查看>>
把 14 亿中国人都拉到一个微信群,在技术上能实现吗?
查看>>
这些代码神注释,请收下我的膝盖
查看>>
斯坦福后空翻机器人设计、代码全开源,成本降至3000美元,人人皆可DIY
查看>>
618|Python购书攻略
查看>>
请停止学习框架
查看>>
考研比惨五大专业排行榜,第一名没人不服!
查看>>
没钱没公司,怎么做一款付费产品
查看>>
Python 3.8 新特性来袭
查看>>
老程序员“被嫌弃”
查看>>
神器:公众号如何从第一篇文章开始看
查看>>
查询亿级数据毫秒级返回!Elasticsearch 是如何做到的?
查看>>