【并发编程】常见的锁

news/2025/2/19 8:47:51/

并发编程三要素

  • 原子性
    • 一个不可再被分割的颗粒,原子性指的是一个操作要么全部执行成功要么全部执行失败。
    • 期间不能被中断,也不存在上下文切换,线程切换会带来原子性问题。

什么是上下文切换:上下文切换是指CPU从一个线程转到另一个线程时,需要保存当前线程的上下文状态,恢复另一个线程的上下文状态,以便于以下次恢复执行该线程时能够正确地运行。
在多线程编程中,上下文切换是一种常见的操作,上下文切换通常是指在一个CPU上,由于多个线程共享CPU时间片,当一个线程的时间片用完后,需要切换到另一个线程运行。此时需要保存当前线程的状态信息,包括程序计数器、寄存器、栈指针等,以便下次继续执行该线程时候能够恢复到正确的执行状态。同时,需要将切换到的线程的状态信息回复,以便于该线程能够正确运行。

  • 有序性
    • 程序执行的顺序按照代码的先后顺序执行,因为处理器可能会对指令进行重排序。

举个例子:1.创建订单 2.减少库存 3.创建物流订单,重排序可能会不按照123去执行,而是312执行。

  • 可见性
    • 一个线程A对共享变量的修改,另一个线程B能够立刻看到

常见的锁种类

  • 悲观锁
    • 当线程去操作数据的时候,总认为别的线程回去修改数据,所以每次它拿数据的时候都会上锁,别的线程去拿数据的时候就会阻塞,比如synchronized、ReentrantLock
  • 乐观锁
    • 每次去拿数据的时候都认为别人不会修改,更新的时候会判断是别人是否回去更新数据,通过版本来判断。
    • 如果数据被修改了就拒绝更新,比如CAS就是乐观锁,但严格来说并不是锁,通过原子性来保证数据的同步
    • 比如数据库的乐观锁,通过版本控制来实现,乐观的认为在数据更新期间没有其他线程影响。

悲观锁适合写操作多的场景,乐观锁适合读操作的场景,乐观锁的吞吐量会比悲观锁多。

  • 公平锁

    • 指多个线程按照申请的顺序来获取锁,简单来说,如果一个线程组里,能保证每个线程都能拿到锁。
    • 比如ReentrantLock(底层是同步队列FIFO:First Input First Output来实现)
  • 非公平锁

    • 获取锁的方式是锁机获取的,保证不了没哥线程都能拿到锁,也就是存在有线程饿死,一直拿不到锁。
    • 比如synchronized、ReentrantLock
  • 独享锁(互斥锁)

    • 也叫他排它锁/写锁/独占锁/独享锁/该锁每一次只能被一个线程所持有,枷锁后任何线程试图再加锁的线程会被阻塞直到当前线程解锁。例如:线程A对data1加上排他锁,则其他线程不能再对data1加任何类型的锁。
    • 获得互斥锁的线程即能读数据又能修改数据
  • 共享锁

    • 也叫S锁/读锁,你那个查看但无法修改和删除的一种数据锁,加锁后其他用户可以并发读取,查询数据但不能修改、增加、删除数据,该锁可被多个线程所持有,用于资源数据共享。
  • 可重入锁

    • 也叫递归锁,在外层使用锁之后,在内存仍然可以使用,并且不发生死锁
  • 不可重入锁

    • 若当前线程执行某个方法已经获取了该锁,那么在方法中尝试再次获取锁时,就会获取不到被阻塞。

可重入锁能一定晨读的避免死锁,synchronized,ReentrantLock重入锁。

  • 自旋锁
    • 一个线程在获取锁的时候,如果锁已经被其他线程获取,那么该线程将循环等待,然后不断的判断锁匙放能够被成功获取,知道获取到锁才会退出循环,任何时候最多只能又一个执行单元获取该锁。
    • 不回发生线程状态切换,一直处于用户态,减少了线程上下文切换的消耗,缺点是循环会消耗CPU。
  • 分段锁
    • 并不是具体的一种锁,只是一种锁的设计,将数据分段上锁,把锁进一步细化粒度,可以提升并发量,当操作不需要更新整个数组的时候,就仅针对数组中的一项进行加锁操作,比如CurrentHashMap底层就用了分段锁。
  • 死锁
    • 两个或两个以上的线程在执行过程中,由于竞争资源或由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法让程序进行下去

http://www.ppmy.cn/news/744029.html

相关文章

C#核心知识回顾——10.List、Dictionary、数据结构、LinkedList

1.List List<int> list new List<int>(); List<String> strings new List<String>();//增list.Add(0);list.Add(1);List<int> ints new List<int>();ints.Add(0);list.AddRange(ints);//插入list.Insert(0, 1);// 位置0插入1//删//1.移…

达人评测 联想小新Air 14 Plus 2021酷睿版怎么样

外观方面&#xff0c;联想小新Air 14 Plus 2021酷睿版采用纤薄金属机身&#xff0c;整机轻至1.41kg&#xff0c;薄至15.9mm&#xff0c;便携性十分出色。而且还支持开盖自动开机人脸识别解锁。联想小新Air 14 Plus 2021酷睿版怎么样这些点很重要http://www.adiannao.cn/dy 屏幕…

Android性能优化问题方案的总结~

虽然总说“英雄不问出处”&#xff0c;但大厂卡学历是默认的“潜规则”。不过最近一个老弟&#xff0c;让我挺振奋的&#xff01;人家完全靠实力上岸。他就属于死磕型的&#xff0c;是我近2年见过的少有的Android性能优化高手。 要说他也挺聪明&#xff0c;贼会选领域。你出去随…

Windows系统上安装Node.js图文步骤流程

Windows系统上安装Node.js图文步骤流程&#xff0c;本文以安装Node.js v4.4.3 LTS(长期支持版本)版本为例&#xff1a; 目录 Node.js下载 Windows 上安装 Node.js 1、Windows 安装包(.msi) 2、Windows 二进制文件 (.exe)安装 版本测试 Node.js下载 Node.js 安装包及源码…

Mac网易云音乐ncm格式转mp3

Mac网易云音乐ncm格式转mp3 最近在网易云音乐上下些歌曲&#xff0c;下载好后发现大部分文件是ncm格式的&#xff0c;在Mac AppStore下载了ncm转换器&#xff0c;转了几首就收费了。 sudo pip3 install pycryptodome mutagen sudo pip3 install githttps://github.com/nondan…

Mac上使用网易云音乐上传音乐mp3到“我的音乐云盘”

前言 网易云音乐mac版&#xff0c;不支持“我的音乐云盘”的上传功能&#xff01;iPhone版也不支持&#xff01; 只能在windows上的网易云音乐里面上传mp3文件。 以下是在Mac上安装windows虚拟机&#xff0c;再上传音乐&#xff5e; 步骤 Mac上安装虚拟机VirtualBox&#x…

opensuse下安装网易云音乐netease-cloud-music

安装环境 opensuse leap 42.3&#xff08;理论上仓库中列出的支持版本都可以用此方法安装&#xff09;官方软件仓库搜索netease&#xff0c;也可直接点击此处打开&#xff1a;https://software.opensuse.org/package/netease-cloud-music?search_termnetease选择对应版本&…

基于开源网易云API+Flutter写的一款音乐播放器

历时2个多月&#xff0c;基于开源网易云API的一款使用Flutter开发的桌面音乐程序终于完成了它的第一个版本v1.0.0&#x1f389;。再次感谢大佬为我们整理并提供众多接口。 先来看看第一版的成品图。 本项目是基于Flutter3.0.5&#xff0c;Dart2.17.6开发的桌面版程序&#xff…