点击上方“业余草”,选择“置顶公众号”

第一时间获取技术干货和业界资讯!

关于线程安全的专有名词有一大堆。你们突然之间问我这个名词是什么意思,那个名词是什么意思我还真不一定能给你准确的回答。这还别说一门语言一堆名词。其实有些名词叫法不同,实际上就是一个意思。

A 语言有这个名词,B 语言就起另外一个名词。不能大胆的雷同,所以就改变一个叫法,其本质还是一样的。

为了减少大家在私信我,那我今天就来扯一扯,竞态条件,竞态资源,轮询忙等,锁变量,原子性,TSL,阻塞,睡眠,唤醒,管程,互斥锁,同步锁,临界区,互斥量,信号量,自旋锁等各个专业名词的实际所代表的含义。

竞态条件:多线程的核心矛盾是“竞态条件”,即多个线程同时读写某个字段。

竞态资源:竞态条件下多线程争抢的是“竞态资源”。

临界区:涉及读写竟态资源的代码片段叫“临界区”。

互斥:保证竟态资源安全的最朴素的一个思路就是让临界区代码“互斥”,即同一时刻最多只能有一个线程进入临界区。

最朴素的互斥手段:在进入临界区之前,用if检查一个bool值,条件不满足就“忙等”。这叫“锁变量”。但锁变量不是线程安全的。因为“检查-占锁”这个动作不具备“原子性”。

TSL:“TSL指令”就是原子性地完成“检查-占锁”的动作。

自旋锁:就算不用TSL指令,也可以设计出线程安全的代码,有一种既巧妙又简洁的结构叫“自旋锁”。当然还有其他更复杂的锁比如“Peterson锁”。

忙等待:但自旋锁的缺点是条件不满足时会“忙等待”,需要后台调度器重新分配时间片,效率低。

解决忙等待问题的是:“sleep”和“wakeup”两个原语。sleep阻塞当前线程的同时不会让出它占用的锁。wakeup可以唤醒在目标锁上睡眠的线程。

互斥量:使用sleep和wakeup原语,保证同一时刻只有一个线程进入临界区代码片段的锁叫“互斥量”。

信号量:把互斥锁推广到"N"的空间,同时允许有N个线程进入临界区的锁叫“信号量”。互斥量和信号量的实现都依赖TSL指令保证“检查-占锁”动作的原子性。

管程:把互斥量交给程序员使用太危险,有些编程语言实现了“管程”的特性,从编译器的层面保证了临界区的互斥,比如Java的synchronized关键字。

互斥锁、独占锁、内置锁:并没有“同步锁”这个名词,Java的synchronized正确的叫法应该是“互斥锁”,“独占锁”或者“内置锁”。但有的人“顾名思义”叫它同步锁。

下面我们简单的来扩展一下。比如下面的程序:

多线程同时执行这段代码可能就会出错。当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。导致竞态条件发生的代码区称作临界区。上例中 add() 方法就是一个临界区,它会产生竞态条件。在临界区中使用适当的同步就可以避免竞态条件。

上面代码中 occupied 就是锁变量。

自旋锁的关键就是用一个 while 轮询,代替 if 检查状态,这样就算线程切出去,另一个线程也因为条件不满足循环忙等,不会进入临界区。这是一个非常常用的结构,不光用在自旋锁,基本是使用条件变量 wait(),notifyAll() 时候的一种惯用法。

自旋锁的缺点是循环忙等。如果并发的线程不像进程调度那样在时间片用完以后会自动切换上下文,就会形成死锁。所以最好在条件不满足的时候,让出线程的控制权,让其他线程有机会执行来使条件满足。

线程安全不管搞出多少名词,都逃不出 3 大核心:原子性、可见性、有序性。推荐阅读《Java 线程安全的3大核心:原子性、可见性、有序性》,其他的相关锁知识,请查看我公众号里的相关文章。

原文链接:https://www.xttblog.com/?p=3865

10T技术资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,GO等等。在公众号内回复对应关键字或框架名字,即可免费获取!!

你再主动一点点   我们就有故事了

一文看懂临界区、互斥锁、同步锁、临界区、信号量、自旋锁等名词!相关推荐

  1. 一文看懂Mysql锁

    一文看懂Mysql锁 Mysql锁 Mysql锁的分类 从性能上 从操作类型上 从锁的粒度上 死锁 死锁的四个条件 死锁的验证 死锁的避免 总结 Mysql锁 既然说到了Mysql锁,那么什么是Mys ...

  2. 一文看懂JUC之AQS机制

     作者:VectorJin juejin.cn/post/6844904041760161806 为了解决原子性的问题,Java加入了锁机制,同时保证了可见性和顺序性.JDK1.5的并发包中新增了Lo ...

  3. mysql删除分表键_一文看懂 MySQL 分区和分表,提高表增删改查效率

    原标题:一文看懂 MySQL 分区和分表,提高表增删改查效率 作者:冯帅,精通Oracle. MySQL. 擅长异构数据库数据同步及迁移.数据库的设计和调优,对高可用方案有深入研究. MySQL分区和 ...

  4. 【转载】同步和互斥的POSIX支持(互斥锁,条件变量,自旋锁)

    上篇文章也蛮好,线程同步之条件变量与互斥锁的结合: http://www.cnblogs.com/charlesblc/p/6143397.html  现在有这篇文章: http://blog.csd ...

  5. 同步和互斥的POSXI支持(互斥锁,条件变量,自旋锁)

    同步和互斥在多线程和多进程编程中是一个基本的需求,互相协作的多个进程和线程往往需要某种方式的同步和互斥.POSIX定义了一系列同步对象用于同步和互斥. 同步对象是内存中的变量属于进程中的资源,可以按照 ...

  6. 一文看懂async和“await”关键词是如何简化了C#中多线程的开发过程

    一文看懂"async"和"await"关键词是如何简化了C#中多线程的开发过程 当我们使用需要长时间运行的方法(即,用于读取大文件或从网络下载大量资源)时,在同 ...

  7. 用户画像标签维度_一文看懂用户画像标签体系(包括维度、应用场景)

    一文看懂用户画像标签体系(包括维度.应用场景) 互联网相关企业在建立用户画像时一般除了基于用户维度(userid)建立一套用户标签体系外,还会基于用户使用设备维度(cookieid)建立相应的标签体系 ...

  8. 判别两棵树是否相等 设计算法_一文看懂生成对抗网络 - GANs?(附:10种典型算法+13种应用)...

    生成对抗网络 – GANs 是最近2年很热门的一种无监督算法,他能生成出非常逼真的照片,图像甚至视频.我们手机里的照片处理软件中就会使用到它. 本文将详细介绍生成对抗网络 – GANs 的设计初衷.基 ...

  9. 极智AI | 一文看懂昇腾达芬奇架构计算单元

        本文详细解释了昇腾达芬奇架构中计算单元的架构与计算原理. 文章目录 1.达芬奇架构概览 2.矩阵计算单元 2.1 矩阵相乘 2.2 矩阵计算单元的计算方式 2.3 向量计算单元的计算方式 2. ...

  10. 一文看懂「生成对抗网络 - GAN」基本原理+10种典型算法+13种应用

    生成对抗网络 – Generative Adversarial Networks | GAN 文章目录 GAN的设计初衷 生成对抗网络 GAN 的基本原理 GAN的优缺点 10大典型的GAN算法 GA ...

最新文章

  1. webpack打包HTML配置自动,十三、HtmlWebpackPlugin的使用 ------- 2019-04-25
  2. HDU 3037 Saving Beans (Lucas法则)
  3. elasticsearch中rollover的用法
  4. JVM学习笔记之-方法区,栈、堆、方法区的交互关系,方法区的理解,设置方法区大小与OOM,方法区的内部结构,方法区使用举例
  5. 如果计算机用户有密码 待机,电脑待机密码怎么设置
  6. go 中使用socket范例
  7. dev调试时无法进入下一步_【问题解决方案】Dev C++ 无法调试的问题与解决
  8. PLC单按钮启停电路与特殊辅助继电器
  9. 电影推荐系统 python简书_电影推荐系统:TMDB 5000 Movie Dataset(一)
  10. 虚拟偶像大众化元年,如何挖掘蓝海市场|虚拟偶像公司2020年盘点
  11. html外联式怎么设置,笔记《三》-html引用css的三种方式-内联,嵌入,外联
  12. 菜鸟教程android数据库,Flutter - Android 菜鸟教程打包
  13. 【PyTorch深度学习项目实战100例】—— 基于ResNet50实现多目标美味蛋糕图像分类 | 第51例
  14. 桃词典 Peach Dictionary 简易英语词典app开发 安卓软件开发 Part 2
  15. 丝裂原活化蛋白激酶TaMPK3抑制植物对ABA的反应
  16. cobar mysql5.6_Cobar init error
  17. 来自灵魂的拷问——知道什么是SQL执行计划吗?
  18. js原生offsetParent解析
  19. 一些软件的安装(cherrytree,mplayer,flash插件)
  20. 基于Springboot的生活方式分享平台的设计与实现

热门文章

  1. C++(37)——骑车与走路
  2. 在中国当程序员,35岁是分水岭?这些新路你知道吗?
  3. 第二章 z变换之四 、序列的z变换与连续时间信号的Laplace变换、Fourier变换的关系
  4. 在项目中CR是什么意思?
  5. 一图理解geos的九交矩阵模型——面面关系
  6. 【微信小程序】文本域输入带最大字数限制(1/100)
  7. 树莓派c语言编程点亮灯,树莓派点灯程序
  8. 微信小程序实现转盘抽奖
  9. 浏览器缓存机制(强缓存和协商缓存)
  10. Mansory设置控件时的约束问题