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

在各类编程语言中,各种应用的开发中,为了提高执行效率,都会有涉及到多线程。而在多线程编程中,有许多的概念,这些概念在书中都以偏教科书的形式描述,并不易于理解。本文将会以更生活化的方式来描述多线程中常见的概念。对于表述的内容,欢迎留言讨论。

并发 VS 并行

多线程编程,一般又会称为并发编程。而与如同孪生兄弟一般的一个概念,叫并行

所谓并发,是在多核之前就已经存在的概念,多个线程通过交替执行来实现任务的执行。而并行,更多的是指多核的基础上,多个线程同时执行。就像我们去WC,此时马桶只有一个,正常的每次只有一个人在使用,这就是单线程执行。

如果有两个或多个人在等待,占有马桶的人便秘,为了短作业优先的原则,换下一个使用,这种每人使用一会儿是多线程并发执行。如果马桶数大于等待人数,人们可以直接使用, 同时进行,这种则是多线程并行执行。

刷墙

假设当前要为一个房子刷颜料,而房子内房间比较多。一开始的时候,工人 A 一个人在干活,每天从早忙到晚,进度缓慢。 (单线程执行)

为了提升效率,工人 A 又找了一个帮手,我们称之为工人 B(多线程)。两个人里,A 更擅长涂料的调配,而 B 更擅长墙面的粉刷。两个人分工合作。在 A 调好涂料好,B 开始粉刷。A 把配好的涂料放到桶里,B 拿到桶,进行粉刷工作。

整个配料包含最主要的三个步骤:

  • 加水
  • 增加涂料
  • 搅拌

有一天,B 心里有事,心不在焉的。A 刚把水倒到桶里,B 就拿走桶使用它开始粉刷,做了不少无用功(由于不正确的执行顺序导致的结果的情况,称为竞态条件)。

A 发现自己桶里的东西,可能会在没配好的时候,被 B 使用到(非原子操作)。为此 A 搬到了一个小房间中,每次一桶涂料配好之后,才会放到涂料区,B 从这里拿到配好的料去进行粉刷。

在 A 配料期间,桶都被 A 占用,B 不再会像之前一样,使用到调配了一半的料。(我们把 A 的一次配料工作称为一次原子操作。同时认为 A 的操作 Happens-before B 的操作)

A 与 B 对桶的使用,两人里,每次只能一人在使用。我们称这种操作是互斥的。

这种通过桶占有的方式来实现的锁定,我们称为隐式锁。Java 里称为 Monitor 锁或管程锁。而为了保证在小房间内不被其他人打扰到,A 每次配料期间,会在门上写上工作中,请稍后,这样别人看到后就不会再进入房间打断,这种形式的锁定,我们称为显式锁。

假设 A 与 B 的涂料交付是在公共区域的涂料区进行,那么,每次A在小房间内配好的料,对于 B 来说,并不知晓。只有A把料放到公共区域内,B 才能使用到。(这就是多线程中常提到的内存可见性)。再假设 A 放到公共区域的料,B 有一段时间没取走,被不知情的人带走了。而之后不久,A 又一次提供料到公共区域,此时B来取料,对于 B 来说,并不了解之前一次 A 曾提供过料。(这是并发中常提到的 ABA 问题)。

以上,是我根据个人理解做的一些类比。这些概念在并发编程中都是相当重要的,后面的文章中,我们再以 Java 中与这些概念对应的实现来举例说明。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值