您的位置 首页 java

并发世界很有趣,不要错过

前言


J ava 有进阶,其名为并发,并发知识之⼤,⼀⼝吃不下 。那好,请您多吃⼏⼝,⼜没说⼀顿吃完,细嚼慢咽才有味. 所有 java 书籍都将并发编程放在其⾼级/进阶篇章中,其重要性不⾔⽽喻,学好并发也是⾃身⾛⼊⾼级⾏列的必备素质之⼀。

并发/并⾏ 进程/ 线程 这些概念总是显得过于抽象,因为这是与操作系统沟通⽤到的词汇,就像我们习惯了使⽤⼗进制算法,⼆进制和 16 进制 就需要思维的切换;⽣活中,我们彼此总是不能互相理解,平静之后,我们知道要换位思考;程序的世界也⼀样,为了更好的理解问题,你也要站在操作系统的⻆度来思考问题,但当你尝试理解对⽅时,是违背⾃⼰认知习惯的,所以有些困难在所难免。

⽣活中你⼀定说过「杀鸡焉⽤⽜⼑?」这句话,并发编程中的各种锁(内置锁/显示锁/偏向锁/轻量锁/重量锁/乐观锁/悲观锁),看到眼花缭乱,有时候很⼩的问题却⽤了很重的锁,这是没有必要的;但是这些锁,没有最好的那个,只有最合适和更⾼效的那个JUC (java.util.concurrent) 包随着 JDK 的版本升级内容也变的越来越多,⾯对琳琅满⽬的并发类,⼜有些⽆从下⼿,其实他们都有⼀定的联系,我们需要找到升级的主线,让其变得有迹可循。

谈及并发编程,我还是带有⼀丝惶恐:

  • 如何将这些抽象的概念变得具象?
  • 如何将编程问题联系到⽣活实际?
  • 如何在抽象和具象之间切换思维?

个⼈觉得这些都是学好并发编程的关键。所以关于并发编程的系列⽂章,我打算从以上⼏点出发,将技术问题以幽默⻛趣具象的⽅式落地。

如何学并发


横看成岭侧成峰,远近⾼低各不同 」,在之前的⽂章中多次引⽤了这段诗词,我们学习技术也要这样,远观看轮 廓,近观看细节,从不同的⻆度看待问题,在后续的⽂章中,也希望⼤家不要将思维局限,尝试跳⼊/跳出,抽象/ 具象 。

郑重声明,接下来不是⼴告 我希望和⼤家共同完成并发编程系列有更多的思想碰撞,希望⼤家在读这个系列 的同时也阅读以下书籍逐步形成⾃⼰的知识体系,这⾥附上个⼈认为的最佳阅读顺序:

1.「 Java并发编程实战 」 该书籍是值得返回看的,第⼀遍不需要精度,主要是为了建⽴⼀个并发的思想,和关键术语的⼤致记忆,先 阅读第 16 章也是极好的,理解 JMM 是实践并发编程的基础 日拱一兵 2. 「 码出⾼效 」 可直接阅读第七章「并发与多线程」,这个章节更好的将技术问题联系到了⽣活实际,有了「并发编程实 战」的铺底,相信,看这个章节会更有感觉

3. 「 Java并发编程之美 」 这本书从第 5 章开始,就会有源码分析,有前辈带领读源码,轻松多了,这回让你更加了解本质,同时也会 找到 JUC 升级的主线

4. 「 Java 并发编程 的艺术 」 这本书会满⾜你从各个⻆度看待并发编程问题

并发开胃菜


不再多废话,拿出之前收藏的⼀篇⽂章作为并发编程的开胃⼩菜,通过这个形象⽐喻,希望⼤家能对并发有个初步 的了解:

摘⾃:

觉得图解的很到位,将并发编程的⼏个核⼼要素都以具象的形式表达出来了,接下来看看何为 进程(process)和 线程(thread)。

进程 process )和 线程 thread )是操作系统的基本概念,但是它们比较抽象,不容易掌握。
最近,我读到一篇材料,发现有一个很好的类比,可以把它们解释地清晰易懂。
1.计算机的核心是 CPU ,它承担了所有的计算任务。它就像一座工厂,时刻在运行。

并发世界很有趣,不要错过


2.假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。

并发世界很有趣,不要错过


3.
进程 就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个 进程 ,其他 进程 处于非运行状态。

并发世界很有趣,不要错过


4.一个车间里,可以有很多工人。他们协同完成一个任务。

并发世界很有趣,不要错过


5.
线程 就好比车间里的工人。一个 进程 可以包括多个 线程

并发世界很有趣,不要错过


6.车间的空间是工人们共享的,比如许多房间是每个工人都可以进出的。这象征一个
进程 的内存空间是共享的,每个 线程 都可以使用这些共享内存。

并发世界很有趣,不要错过


7.可是,每间房间的大小不同,有些房间最多只能容纳一个人,比如厕所。里面有人的时候,其他人就不能进去了。这代表一个
线程 使用某些共享内存时,其他 线程 必须等它结束,才能使用这一块内存。

并发世界很有趣,不要错过


8.一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫”互斥锁”(Mutual exclusion,缩写 Mutex),防止多个
线程 同时读写某一块内存区域。

并发世界很有趣,不要错过


9.还有些房间,可以同时容纳n个人,比如厨房。也就是说,如果人数大于n,多出来的人只能在外面等着。这好比某些内存区域,只能供给固定数目的
线程 使用。

并发世界很有趣,不要错过


10.这时的解决方法,就是在门口挂n把钥匙。进去的人就取一把钥匙,出来时再把钥匙挂回原处。后到的人发现钥匙架空了,就知道必须在门口排队等着了。这种做法叫做” 信号量 “( semaphore ),用来保证多个
线程 不会互相冲突。
不难看出,mutex是semaphore的一种特殊情况(n=1时)。也就是说,完全可以用后者替代前者。但是,因为mutex较为简单,且效率高,所以在必须保证资源独占的情况下,还是采用这种设计。

并发世界很有趣,不要错过


11.操作系统的设计,因此可以归结为三点:
(1)以多
进程 形式,允许多个任务同时运行;
(2)以多
线程 形式,允许单个任务分成不同的部分运行;
(3)提供协调机制,一方面防止
进程 之间和 线程 之间产生冲突,另一方面允许 进程 之间和 线程 之间共享资源。

并发世界很有趣,不要错过

相信看过这之后就了解了并发编程⼤概要关注的⼀些内容了,在后续的⽂章中,希望⼤家牢记,你是⼀个⼯⼚只能 有⼀个⻋间运⾏的负责⼈,如何让⼯⼈⾼效的⼲活且不出差错,也不起冲突,你就是合格的负责⼈……

文章来源:智云一二三科技

文章标题:并发世界很有趣,不要错过

文章地址:https://www.zhihuclub.com/183489.shtml

关于作者: 智云科技

热门文章

评论已关闭

11条评论

  1. You have made your point quite effectively..
    help me write my scholarship essay pay to do my essay

  2. Many thanks, A good amount of knowledge!
    essay writer free show me how to write a resume for free

  3. Awesome information, Thank you!
    top essay writers did john legend write all of me for his wife

  4. Many thanks! Great stuff.
    personal statement writing service best essay writing service reviews

网站地图