原文作者:知识铺

原文地址:Java知识进阶-程序员必懂的自旋锁CLHLock原理

目录

一、CLHLock

1、原理

2、获取锁步骤:

二、MCSLock

1、原理

2、步骤


一、CLHLock

1、原理

内部实现的是一种基于原子操作的链表,特点:可扩展、高性能、公平的自旋锁。线程是在自身本地变量上自旋,不断轮询它的链表前一个节点状态。解决问题:避免多个线程一起来,一起竞争的不公平性问题,提供了一种先来先服务的公平性;如 银行的取号机。简单源码演示:

2、获取锁步骤:

第一个线程: 第一次来获取锁,立刻获取到锁

第二个线程: 线程一还没有处理完,就要加入到队列,并关心它的前驱节点锁状态,然后进行自旋。thread2 获取到的前驱节点是thread1,它锁是true状态,只能进入while循环。后续线程以此类推,添加到队里中。

第三步: 释放锁, thread1 把自身的locked = false ,同时把当前节点改为了前节点。

二、MCSLock

1、原理

  • 原理:与CLHLock原理差不多,(CLHLock参阅前一章知识点)
  • 区别:链表结构不同 , 自旋自身节点
  • 解决问题:同样公平性问题,先到先服务问题

简单源码演示:

2、步骤

注意点1: 第一个线程,第一次进来就进入了获取锁

注意点2: 第二个线程进入,线程1还没有结束,自身先自旋等待

注意点3: 解锁 , 检测到后续有节点,就把后续节点 locked=false,相当于把锁释放给了后续节点。

Java并发编程—自旋锁CLHLock原理相关推荐

  1. Java并发编程-无锁CAS与Unsafe类及其并发包Atomic

    [版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/72772470 出自[zejian ...

  2. Java并发编程之锁机制之LockSupport工具

    关于文章涉及到的jdk源码,这里把最新的jdk源码分享给大家----->jdk源码 前言 在上篇文章<Java并发编程之锁机制之AQS(AbstractQueuedSynchronizer ...

  3. Java 并发编程—有锁互斥机制及AQS理论

    原文作者:Java并发编程 原文地址:AQS这样学就很简单了 目录 一.有锁互斥机制 二.AQS如何实现互斥 三.结语 如果你是道格李,你要实现一套机制来保证线程互斥,你会如何实现呢?你肯定不会一上来 ...

  4. Java并发编程—定时器Timer底层原理

    原文作者:妮蔻 原文地址:Java并发编程笔记之Timer源码分析 目录 一.timer问题复现 二.Timer 实现原理分析 timer在JDK里面,是很早的一个API了.具有延时的,并具有周期性的 ...

  5. java并发锁有哪些,Java并发编程-公平锁与非公平锁

    写这个文章的时候让我想起了让子弹飞的一个台词 公平,公平,还是tmd公平! 什么是公平和非公平 首先,我们来看下什么是公平锁和非公平锁. 公平锁指的是按照线程请求的顺序,来分配锁: 非公平锁指的是不完 ...

  6. Java并发编程 Synchronized及其实现原理

    Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法.Synchronized的作用主要有三个:(1)确保线程互斥的访问同步代码(2)保证共享变量的修改能够及时可见 ...

  7. 【java】java 并发编程 StampedLock 锁 【不重要】

    文章目录 1.概述 2.synchronized 3.读写锁 3.1 读写锁缺点 4.StampedLock 4.1 缺点 5.案例 5.1 案例1 5.1 案例2 6.性能对比 7.总结 1.概述 ...

  8. Java并发编程-synchronized锁优化

    目录 1.小故事 2.轻量级锁 3.锁膨胀 4.自旋优化 5.偏向锁 5.1.概述 5.2.偏向锁状态 5.3.偏向锁撤销 5.3.1.调用对象hashCode 5.3.2.其它线程使用对象 5.3. ...

  9. Java并发 - 初识自旋锁

    自旋锁 首先我们需要理解:阻塞还有唤起线程都需要操作系统切换CPU状态去完成,这种状态转换需要耗费处理器时间,如果同步代码块中的任务十分简单,可能切换状态的时间要大于我们处理同步资源的时间了. 在许多 ...

最新文章

  1. 浅显易懂 Makefile 入门 (01)— 什么是Makefile、为什么要用Makefile、Makefile规则、Makefile流程如何实现增量编译
  2. 一款小巧好用的MAC地址扫描器
  3. 服务机器人---多传感器融合
  4. 模拟课----需求文本
  5. php大马免杀技巧 | bypass waf
  6. log4j mysql_log4j写入mysql数据库 | 学步园
  7. 杰里之混响音效调试【篇】
  8. 微信公众号定位显示EC-01G模组+STM32F103
  9. 今天又是一个全新的开始...
  10. PMP备考大全:经典题库(5月)
  11. 【打卡-Coggle竞赛学习2023年2月】图节点嵌入
  12. Dilated conv扩张卷积的理解(一看就会)
  13. 国内知名插画培训机构有哪些
  14. Python数据分析辅助审计工作
  15. LINUX NGINX 环境禁止访问指定后缀文件
  16. 混迹职场N年后,人过中年,如何不被社会所淘汰?
  17. 基于ESP8266与Blinker(点灯科技平台)的智能遥控器设计
  18. Google Play Store 应用无法安装解决方案
  19. android内存泄漏检测工具,Android内存泄漏的检测工具——LeakCanary
  20. 服务器存储hba卡直连,hba卡直连存储_fc hba卡之间如何连接_hba卡怎么连存储(5)

热门文章

  1. 制作bat脚本,抓取Android设备logcat
  2. Android GestureDetector方法详解
  3. android 自定义控件(FloatLabelLayout)
  4. JavaScrpt简单介绍
  5. mysql数据库操作指令汇总
  6. java程序员面试经历(不忘初心,永不放弃,放得始终)。
  7. 从1~N中任选出三个数,最小公倍数最大
  8. Android:日常学习笔记(6)——探究活动(3)
  9. gRPC源码分析2-Server的建立
  10. python for selenium 数据驱动测试