热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

稳住多线程翻车的现场

若有收获,请记得分享和转发哦前言先来看看虚构的小故事已经晚上11点了,程序员小明的双手还在键盘上飞舞着,眼神依然注视着的电脑屏幕。没办法这段时间公司业绩

ef7cee613bb7ca4c4f90f4f738e491a3.png

若有收获,请记得分享和转发哦

前言

先来看看虚构的小故事

已经晚上 11 点了,程序员小明的双手还在键盘上飞舞着,眼神依然注视着的电脑屏幕。

没办法这段时间公司业绩增长中,需求自然也多了起来,加班自然也少不了。

天气变化莫测,这时窗外下起了蓬勃大雨,同时闪电轰鸣。

但这一丝都没有影响到小明,始料未及,突然一道巨大的雷一闪而过,办公楼就这么停电了,随后整栋楼都在回荡着的小明那一声撕心裂肺的「卧槽」。

此时,求小明的心里面积有多大?

等小明心里平复后,突然肚子非常的痛,想上厕所,小明心想肯定是晚上吃的某堡王有问题。

整栋楼都停了电,小明两眼一抹黑,啥都看不见,只能靠摸墙的方法,一步一步的来到了厕所门口。

到了厕所(共享资源),由于实在太急,小明直接冲入了厕所里,用手摸索着刚好第一个门没锁门,便夺门而入。

这就荒唐了,这个门里面正好小红在上着厕所,正好这个厕所门是坏了的,没办法锁门。

黑暗中,小红虽然看不见,但靠着声音,发现自己面前的这扇门有动静,觉得不对劲,于是铆足了力气,用她穿着高跟鞋脚,用力地一脚踢了过去。

小明很幸运,被踢中了「命根子」,撕心裂肺地喊出了一个字「痛」!

故事说完了,扯了那么多,实际上是为了说明,对于共享资源,如果没有上锁,在多线程的环境里,那么就可能会发生翻车现场。

接下来,用 30+ 张图,带大家走进操作系统中避免多线程资源竞争的互斥、同步的方法。

1ef50183909eabfc7cd80f9d656d803e.png

正文

4221af08ab1f95831f513e7b82f64fbe.png

f55c19703cb2313057873fc564844d40.png

所以,线程之间是可以共享进程的资源,比如代码段、堆空间、数据段、打开的文件等资源,但每个线程都有自己独立的栈空间。

600771e27a500d92eb64f29bddb49997.png

02d1a8700ef2cbc7e9c170d137c54b98.png

ddb82f228051775ead938033a0cccc17.png

09e5f0faed11db3d1ae5e31b874c3eb7.png

47276ffeb92cd45df039f2d4918fb1ed.png

7bf292374883a307f409ed2e6fb90590.png

17b71196a4c198ce217a512ddfbeb03a.png

3d9adccbc7e6084ac14bfb88143e3e95.png

d0d4b7cb7b4d03dddfe18fd045e29d67.png

举个生活的同步例子,你肚子饿了想要吃饭,你叫妈妈早点做菜,妈妈听到后就开始做菜,但是在妈妈没有做完饭之前,你必须阻塞等待,等妈妈做完饭后,自然会通知你,接着你吃饭的事情就可以进行了。

124c02e230832d22c30215e0c1c2b8ce.png

6f198c0029b03ff7a40a908c70933f31.png

f6f3beb98e285236fc1289441687cc59.png

1c72840f8312fd918962b016fffbdedb.png

b4b58ce4cb07de129cbd844ad8ef7cf1.png

1f5fed3fc2f05b45eb274cd9fb49a9d4.png

51a280534d33e5a84606c8a57e5c1b92.png

63d8377e98bf0eb88bb03dec24d4e41a.png

aa3b5a16595a3e07a652f3d3839f2ee7.png

d4f587bf73e52f7083e7b6025cb59cad.png

79734d0a1765cc0e7185424251b78eb1.png

60528c2d72bd58a3e6f46ecec11172a2.png

8a757e55cfb539bf01dfaf23d74ebaa7.png

b32d76f52cde6fed3abf881e2272a169.png

086f1b5d41233a122b953f69604701f9.png

fd9423890c7cdc5200bc58f334076a40.png

3477c1f0c4d3fc2d3e9354d41eda620f.png

2e9e8e3e8e16f3cb05aff2cd3052baae.png

f8359c5edef41d94152ef3ebeb5a2cb7.png

8c0655158f538d374236e55d96745e45.png

当然,我这回答槽透了,所以当场 game over,残酷又悲惨故事,就不多说了,反正当时菜就是菜。

时至今日,看我来图解这道题。

0a916c602fb28d65d8432a1f1950850c.png

c1e7057827f1e7dfa5a8402ed7325905.png

5adf64eebba658e86a80fcb453575b5a.png

bf5ec794e0dbe219be66754a5041a3e6.png

959cfacfdae4eff79787de6711c343c1.png

055427225c855193929bb9e29b9a5614.png

1dd280d1cadc91ccc132f923e2de93c6.png

341cd4091b4db3e456464cba3ae78ba5.png

d1ecd56363cf683f3a8d5fd93869ff60.png

49b441f0e9406545772e3b2941a26460.png

043ecb3cd9301ef14eba5d684c6b12b8.png

8102e13d7f26dd21a275214753590fcf.png

347db7a7f264e3a842b4ff1f3634fa94.png

10c08584065b4fcb78850de41df81f0c.png

27b0d61e79abf25d821e042b75150dce.png

6f7ff25028ddc4d128e57e7d635fdccb.png

add6574717277435717feba93c540f1a.png

8d3a7e7a49314c223c206e6e04fb379a.png

ec9a28db056c134945d83d4bf0cfba1e.png

f91dab9e1238b1d32ecb4e1cb997a507.png

6c98e90d8c0f52125957a02a98bfa0a2.png

57e18408044737631cd6ff71774a1cc9.png

c75d1fcbbdbef1a573bb3ad7d9570370.png


推荐阅读
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 深入理解Java中的volatile、内存屏障与CPU指令
    本文详细探讨了Java中volatile关键字的作用机制,以及其与内存屏障和CPU指令之间的关系。通过具体示例和专业解析,帮助读者更好地理解多线程编程中的同步问题。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 深入解析:阿里实战 SpringCloud 微服务架构与应用
    本文将详细介绍 SpringCloud 在微服务架构中的应用,涵盖入门、实战和案例分析。通过丰富的代码示例和实际项目经验,帮助读者全面掌握 SpringCloud 的核心技术和最佳实践。 ... [详细]
  • 并发编程:深入理解设计原理与优化
    本文探讨了并发编程中的关键设计原则,特别是Java内存模型(JMM)的happens-before规则及其对多线程编程的影响。文章详细介绍了DCL双重检查锁定模式的问题及解决方案,并总结了不同处理器和内存模型之间的关系,旨在为程序员提供更深入的理解和最佳实践。 ... [详细]
  • 随着网络安全威胁的不断演变,电子邮件系统成为攻击者频繁利用的目标。本文详细探讨了电子邮件系统中的常见漏洞及其潜在风险,并提供了专业的防护建议。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 本文介绍了多个关于JavaScript的书籍资源、实用工具和编程实例,涵盖从入门到进阶的各个阶段,帮助读者全面提升JavaScript编程能力。 ... [详细]
  • 分享一个简化版的Silverlight链接图项目:Link Map Simplified
    本文介绍了一个使用Silverlight开发的可视化工具,主要用于展示和操作复杂的实体关系图(Graph)。该工具在犯罪调查系统中得到了广泛应用,帮助用户直观地获取和理解相关信息。 ... [详细]
  • 本文详细介绍如何通过修改配置文件来隐藏Apache、Nginx和PHP的版本号,从而增强网站的安全性。我们将提供具体的配置步骤,并解释这些设置的重要性。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • Linux系统中Java程序Too Many Open Files问题的深入解析与解决方案
    本文详细分析了在Linux环境下运行的Java应用程序中可能出现的“Too many open files”异常现象,探讨其成因及解决方法。该问题通常出现在高并发文件访问或大量网络连接场景下,对系统性能和稳定性有较大影响。 ... [详细]
author-avatar
哥哥很霸道_277
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有