线程与并发基础

 #

   试想当你熟悉所有的英雄的技能效果和CD时间,那么对线对面英雄并自爆一路其实是一件很简单的事情,试想你不从青铜开始训练,怎么可能从菜鸟变为大神,接进入话题吧,其实我们为什么要学习高并发的知识,其实不难发现,对于传统的ERP系统或者是公司内部使用系统,用到这部分的知识不多,无非是CRUD嘛,但是随着互联网行业的发展,一些Web服务器并发访问量急速的增加,特别是对于电商类的,抢购类项目或游戏类的服务器,数据安全性,准确性显得尤为重要,很难发现很多互联网公司的招聘公告无不一致要求应聘者熟悉线程并发的知识,恰好楼主,最近也是在接触此类的项目,并在慢慢摸索这方面的知识,在看一本叫《JAVA并发编程实践》的书本,因此趁此机会把楼主理解的知识记录在这里。

 首先要明确以下几个概念#

一,并发与并行

 

  • 我们知道,并行操作是针对多核CPU的,因此对于有限的CPU下,如何提高程序运行速率,就要采用并发操作(充分利用CPU资源)。

 

二,临界区

  • 临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用。但是每一次,只能有一个线程使用它,一旦临界区资源被占用,其他线程要想使用这个资源,就必须等待。

 

三,阻塞(Blocking)和非阻塞(Non-Blocking),同步和异步

  • 阻塞和非阻塞通常用来形容多线程间的相互影响。阻塞是,比如一个线程占用了临界区资源,那么其它所有需要这个资源的线程就必须在这个临界区外进行等待,等待会导致线程挂起。这种情况就是阻塞。此时,如果占用资源的线程一直不愿意释放资源,那么其它所有阻塞在这个临界区上的线程都不能工作。
  • 非阻塞允许多个线程同时进入临界区,或者在遇到需要等待的时刻,不等待而选择去做其他的事情

  讲个故事:老王烧开水

  出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。

  老王想了想,有好几种等待方式

  1.老王用水壶煮水,并且站在那里,不管水开没开,每隔一定时间看看水开了没。-同步阻塞

  老王想了想,这种方法不够聪明。

  2.老王还是用水壶煮水,不再傻傻的站在那里看水开,跑去寝室上网,但是还是会每隔一段时间过来看看水开了没有,水没有开就走人。-同步非阻塞

  老王想了想,现在的方法聪明了些,但是还是不够好。

  3.老王这次使用高大上的响水壶来煮水,站在那里,但是不会再每隔一段时间去看水开,而是等水开了,水壶会自动的通知他。-异步阻塞

  老王想了想,不会呀,既然水壶可以通知我,那我为什么还要傻傻的站在那里等呢,嗯,得换个方法。

  4.老王还是使用响水壶煮水,跑到客厅上网去,等着响水壶自己把水煮熟了以后通知他。-异步非阻塞

  老王豁然,这下感觉轻松了很多。

  • 同步和异步
  • 同步就是烧开水,需要自己去轮询(每隔一段时间去看看水开了没),异步就是水开了,然后水壶会通知你水已经开了,你可以回来处理这些开水了。
  • 同步和异步是相对于操作结果来说,会不会等待结果返回。

 

  • 阻塞和非阻塞
  • 阻塞就是说在煮水的过程中,你不可以去干其他的事情,非阻塞就是在同样的情况下,可以同时去干其他的事情。阻塞和非阻塞是相对于线程是否被阻塞。

 

四,死锁(Deadlock)、饥饿(Starvation)和活锁(Livelock)

  • 死锁:简单来说,比如你去面试面试官问:你告诉我什么是死锁,我就录用你,而你回答:你录用我,我就告诉你什么是死锁!
  • 饥饿:饥饿是指某一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执行, 比如电梯等人!
  • 活锁:我有资格坐电梯,但是这趟电梯已经满人超载了,我要继续等!

 

  掌握了这些概念之后,砸门下一阶段就学习一下线程的操作以及状态

 

posted @   卓庆森  阅读(387)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示
主题色彩