互斥锁和自旋锁

  • 互斥锁加锁失败后,线程会释放 CPU ,给其他线程;

  • 自旋锁加锁失败后,线程会忙等待,直到它拿到锁;

互斥锁,是一种「独占锁」,加锁失败时,会从用户态陷入到内核态,让内核帮我们切换线程;

线程的上下文切换的是什么?

当两个线程是属于同一个进程,因为虚拟内存是共享的,所以在切换时,虚拟内存这些资源就保持不动,只需要切换线程的私有数据、寄存器等不共享的数据

自旋锁,是通过 CPU 提供的 CAS函数(Compare And Swap),在「用户态」完成加锁和解锁操作,不会主动产生线程上下文切换,所以相比互斥锁来说,会快一些,开销也小一些。

互斥锁和自旋锁都是最基本的锁,读写锁可以根据场景来选择这两种锁其中的一个进行实现。

如果你能确定被锁住的代码执行时间很短,就不应该用互斥锁,而应该选用自旋锁,否则使用互斥锁。

乐观锁和悲观锁

概念

乐观锁:乐观锁在操作数据时非常乐观,认为别人不会同时修改数据。因此乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据:如果别人修改了数据则放弃操作,否则执行操作。

悲观锁:悲观锁在操作数据时比较悲观,认为别人会同时修改数据。因此操作数据时直接把数据锁住,直到操作完成后才会释放锁;上锁期间其他人不能修改数据。

实现

乐观锁:实现方式主要有两种:CAS机制版本号机制

悲观锁:实现方式是加锁,加锁既可以是对代码块加锁(如Java的synchronized关键字),也可以是对数据加锁(如MySQL中的排它锁)

适用场景

功能限制

与悲观锁相比,乐观锁适用的场景受到了更多的限制,无论是CAS还是版本号机制。

例如,CAS只能保证单个变量操作的原子性,当涉及到多个变量时,CAS是无能为力的,而synchronized则可以通过对整个代码块加锁来处理。再比如版本号机制,如果query的时候是针对表1,而update的时候是针对表2,也很难通过简单的版本号来实现乐观锁。

竞争激烈程度

  • 当竞争不激烈 (出现并发冲突的概率小)时,乐观锁更有优势,因为悲观锁会锁住代码块或数据,其他线程无法同时访问,影响并发,而且加锁和释放锁都需要消耗额外的资源

  • 当竞争激烈(出现并发冲突的概率大)时,悲观锁更有优势,因为乐观锁在执行更新时频繁失败,需要不断重试,浪费CPU资源,可通过引入退出机制,如重试次数超过一定阈值后失败退出。当然,更重要的是避免在高竞争环境下使用乐观锁。

追问

  • 乐观锁加锁吗? 乐观锁本身不加锁,但有时乐观锁可能与加锁操作合作(MYSQL的排它锁)

  • CAS有哪些缺点?  ABA问题,那就是一个线程改动了内存的数据,但是CAS比较的值被该线程该回了原先的值,CAS操作成功了,比较有效的方案是引入版本号,内存中的值每发生一次变化,版本号都+1,在进行CAS操作时,不仅比较内存中的值,也会比较版本号,只有当二者都没有变化时,CAS才能执行成功

常见的几种锁(互斥锁,自旋锁,乐观锁,悲观锁)相关推荐

  1. mysql悲观锁会有脏数据吗_mysql悲观锁原理详解

    mysql中的锁概念 mysql已经成为大家日常数据存储的最常用平台,但随着业务量和访问量的上涨,会出现并发访问等场景,如果处理不好并发问题的话会带来严重困扰.下面介绍一下如何通过mysql的悲观锁来 ...

  2. mysql悲观锁只用于读取吗_MySQL中悲观锁和乐观锁到底是什么?

    索引和锁是数据库中的两个核心知识点,隔离级别的实现都是通过锁来完成的 按照锁颗粒对锁进行划分 ? 锁用来对数据进行锁定,我们可以从锁定对象的粒度大小来对锁进行划分,分别为行锁.页锁和表锁.行锁就是按照 ...

  3. mysql乐观和悲观锁实现_mysql实现乐观锁和悲观锁该怎么编写?

    乐观锁和悲观锁相信大家都是知道的,这是java中的基础知识,今天我们就来看看它们两者该如何使用代码实现吧. 乐观锁实现 1).表设计 表task,分别有三个字段id,value.version 2). ...

  4. 互斥锁、自旋锁和自适应自旋锁

    互斥锁: 从 实现原理上来讲,Mutex属于sleep-waiting类型的锁.例如在一个双核的机器上有两个线程(线程A和线程B),它们分别运行在Core0和 Core1上.假设线程A想要通过pthr ...

  5. 详解各种锁:CAS、共享锁、排它锁、互斥锁、悲观锁、乐观锁、行级锁、表级锁、页级锁、死锁、JAVA对CAS的支持、ABA问题、AQS原理

    共享锁(S锁) 又称为读锁,可以查看但无法修改和删除的一种数据锁.如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排它锁.获准共享锁的事务只能读数据,不能修改数据. 共享锁下其它用 ...

  6. Java面试题之:乐观锁、悲观锁与自旋锁及其相关锁的优化(万字知识点详解)

    Java面试题之:乐观锁.悲观锁与自旋锁及其锁的优化 一.乐观锁 二.悲观锁 三.自旋锁 ①自旋锁的优缺点 ②自旋锁时间阈值(1.6 引入了适应性自旋锁) ③自旋锁的开启 四.Synchronized ...

  7. 悲观锁和乐观锁_乐观锁和悲观锁 以及 乐观锁的一种实现方式-CAS

    悲观锁 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞知道它拿到锁.传统的关系型数据库里面就用到了很多的这种锁机制,比如行锁,表锁等 ...

  8. 乐观锁与悲观锁以及乐观锁的一种实现方式-CAS

    首先介绍一些乐观锁与悲观锁: 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁.传统的关系型数据库里边就用到了很 ...

  9. Java并发 乐观锁和悲观锁 乐观锁的一种实现方式CAS

    为什么80%的码农都做不了架构师?>>>    首先介绍一些乐观锁与悲观锁: 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人 ...

  10. Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS

    Java并发问题–乐观锁与悲观锁以及乐观锁的一种实现方式-CAS </h1><div class="clear"></div><div c ...

最新文章

  1. 一代偶像终将老去,总有AI正在年轻
  2. wpf(c#)中获取ComboBox选项值
  3. python 栈的压入弹出序列
  4. 用yacc编写的算术运算计算器_Linux里隐藏的计算器,你知道它的奥秘吗?
  5. python3ide_Python IDE Windows下载3.4.2 安装版
  6. alter database open resetlogs
  7. 单机环境RocketMQ的安装
  8. c语言程序设计对称字符串,C语言程序设计(字符串)
  9. 一位全加器的结构描述vhdl_小学数学结构化学习的评价实践探索
  10. 备份数据库的expdp语句_【ORACLE语句备份】数据库表同步 ——定时任务管理器(EXPDP导出,IMPDP导入)...
  11. Dxg——[版本管理工具Git SVN]开发笔记整理分类合集【所有的相关记录,都整理在此】
  12. fritzing元件太少_fritzing传感器元件库
  13. 紫色范冰冰WIN7主题包
  14. Java面试图片找规律,校招 - 行业测评题、图形推理题、逻辑思维面试题,解题技巧汇总...
  15. awgn信道matlab,AWGN信道下数字通信系统的蒙特卡洛仿真(基于matlab).doc
  16. 苹果手机上怎么安装ipa文件?
  17. 不负韶华 只争朝夕(2019年终报告)
  18. 操作系统实验四 进程同步与互斥
  19. 常见数据挖掘算法和Python简单实现
  20. 算法--01背包问题(动态规划算法) 21-01-30

热门文章

  1. java中的数据结构——栈
  2. 【Go】Go语言中反射包的实现原理(The Laws of Reflection)
  3. 皮卡丘为什么不进化_皮卡丘为什么不进化?
  4. 如何让PPT给你的presentation加分
  5. 理解标准差、标准化、协方差、正态分布
  6. 距离拿下千亿市场,AR眼镜还缺什么?
  7. 产业链图谱:2021年中国智能制造业产业链图谱|产业链全景图
  8. 包误差率(PER)与BER相关
  9. 2019配电安规电子版_2018年配电安规.docx
  10. 计算机基础中图文混排的重要性,浅谈项目教学在技校计算机应用基础中的应用.doc...