CLH锁即Craig, Landin, and Hagersten (CLH) locks,CLH锁是一个自旋锁,能确保无饥饿性,提供先来先服务的公平性。

何谓自旋锁?它是为实现保护共享资源而提出一种锁机制。其实,自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。

CLHLock的java实现逻辑:

Java代码 publicclassCLHLockimplementsLock {

privatefinalAtomicReference tail;

privatefinalThreadLocal myPred;

privatefinalThreadLocal myNode;

publicCLHLock() {

tail = newAtomicReference(newQNode());

myNode = newThreadLocal() {

protectedQNode initialValue() {

returnnewQNode();

}

};

myPred = newThreadLocal();

}

@Override

publicvoidlock() {

QNode node = myNode.get();

node.locked = true;

QNode pred = tail.getAndSet(node);

myPred.set(pred);

while(pred.locked) {

}

}

@Override

publicvoidunlock() {

QNode node = myNode.get();

node.locked = false;

myNode.set(myPred.get());

}

privatestaticclassQNode {

volatilebooleanlocked;

}

}

锁本身被表示成QNode的虚拟链表。共享的tail保存申请的最后的一个申请lock的线程的myNode域。每个申请lock的线程通过一个本地线程变量pred指向它的前驱。另外一个本地线程变量myNode的locked保存本身的状态,true:正在申请锁或已申请到锁;false:已释放锁。每个线程通过监视自身的前驱状态,自旋等待锁被释放。释放锁时,把自身myNode的locked设为false,使后继线程获的锁,并回收前驱的QNode,等待下次使用,因为自身的QNode可能被tail获后继引用,而前驱不再使用老的QNode。

AbstractQueuedSynchronizer的实现也是部分基于"CLH"队列的思想。具体见AbstractQueuedSynchronizer的doAcquireSharedInterruptibly方法实现

AbstractQueuedSynchronizer 为实现依赖于先进先出 (FIFO) 等待队列的阻塞锁定和相关同步器(信号量、事件,等等)提供一个框架。用java的人都知道synchronized能够对一个需要确保线程安全的对象,方法实现多线程并发控制,这是在java语法层次的实现,而AbstractQueuedSynchronizer 则是在应用层次而不是语法层次(更高的层次)提供了实现多线程并发控制组件的基础。

java clh_CLH锁学习相关推荐

  1. java公平锁和非公平锁_java并发编程学习之再谈公平锁和非公平锁

    在java并发编程学习之显示锁Lock里有提过公平锁和非公平锁,我们知道他的使用方式,以及非公平锁的性能较高,在AQS源码分析的基础上,我们看看NonfairSync和FairSync的区别在什么地方 ...

  2. java同步锁优化方案学习笔记(偏向锁,轻量级锁,自旋锁,重量级锁)

    目录 一,概述 二,CAS算法 三,Java对象的对象头,以及Mark Word 四,偏向锁 Baised Lock 五,轻量级锁 六,自旋锁 SpinLock 七,重量级锁 八,在应用层提高锁效率的 ...

  3. Java培训深度学习都要学什么

    java的知识点有很多,如果是有java基础的同学,进行深度学习是非常有必要的,比较职场技能更新迭代非常的快,那么java培训深度学习都要学什么呢?来看看下面的详细介绍. Java培训深度学习都要学什 ...

  4. java/android 设计模式学习笔记(1)--- 单例模式

    前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使 ...

  5. java投票锁_Java并发编程锁之独占公平锁与非公平锁比较

    Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁.其实Java中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家去排队本着先来 ...

  6. java初学课程_作为java新手应该学习什么课程

    照目前IT行业发展趋势,学java的人越来越多,因为java的应用范围广,薪资待遇在IT行业里也是名列前茅,那么,作为java新手应该学习什么课程呢?动力节点java学院的小编来告诉大家新手应该学哪些 ...

  7. java细粒度锁_Java细粒度锁实现的3种方式

    最近在工作上碰见了一些高并发的场景需要加锁来保证业务逻辑的正确性,并且要求加锁后性能不能受到太大的影响.初步的想法是通过数据的时间戳,id等关键字来加锁,从而保证不同类型数据处理的并发性.而java自 ...

  8. java程序员学习路线以及我的学习经验

    本文作者为优知学院创始人陈睿(mike),作者有10年以上技术&产品经验,曾任百度研发经理.携程定制旅游CTO. " 这是一篇完整的java程序员学习线路图,一共分为六个阶段. 我以 ...

  9. Java多线程系列(四):4种常用Java线程锁的特点,性能比较、使用场景

    多线程的缘由 在出现了进程之后,操作系统的性能得到了大大的提升.虽然进程的出现解决了操作系统的并发问题,但是人们仍然不满足,人们逐渐对实时性有了要求. 使用多线程的理由之一是和进程相比,它是一种非常花 ...

  10. 菜鸟入门:Java程序员学习之路

     1. Java语言基础 谈到Java语言基础学习的书籍,大家肯定会推荐Bruce Eckel的<Thinking in Java>.它是一本写的相当深刻的技术书籍,Java语言基础部分基 ...

最新文章

  1. c语言结点初始化,C语言双向链表简单实现及图示(初始化/插入节点/删除节点)...
  2. ValueError: Input contains NaN, infinity or a value too large for dtype(‘float64‘).
  3. Ajax请求SSM后台时提示:Invalid character found in the request target. The valid characters are defined in RF
  4. html浮动代码_(10)让“盒子”动起来:① 浮动 | CSS
  5. 图像处理之调整亮度与饱和度
  6. 排列不同的三位数c语言,C语言求助!一个三位数的逆序数,总是编不对
  7. 程序员福音,关于如何使用Markdown写出一份漂亮的简历 —— 程序员简历 | md文档简历制作教程
  8. 创建Oracle定时任务及其各项操作
  9. cat环境搭建及springboot项目接入
  10. pyinstaller打包程序带图片终极教程
  11. 【Pandas分组聚合】进阶:透视表、交叉表(pivot_table() 、crosstab())
  12. 给 perl hacker 们看的(ReShip)
  13. Android手机与PC端进行通信
  14. CST仿真指导 | 如何构建个性化的用户界面
  15. 深兰科技亮相2022世界人工智能大会:AI创新,共话未来城市建设
  16. 智能运维探索:有一种多指标异常检测方案,你可能没用过...
  17. Inventor 2020 安装教程
  18. 《浮世绘---湖北人,你到底患了什么病》(转载)
  19. 对金钱金额的处理--每三位间隔‘,‘,末尾保留两位小数
  20. 抖音xgorgon及设备参数生成算法

热门文章

  1. 不变初心数 (15 分) C语言
  2. TesterHome android app 编写历程(四)
  3. 视频边缘模糊怎么做,将视频四周虚化而突出中间画面显示
  4. 达索系统基于3DEXPERIENCE平台开发工具介绍
  5. HDU 5602 Black Jack (记忆化搜索+DP)*
  6. Vuejs 的入门(笔记)
  7. 10计算机语言代表什么,win10是什么编程语言写的_win10史诗般的巨型编程项目
  8. CF1153F Serval and Bonus Problem
  9. 超级表格全新升级,这些功能你不可能在其他软件上看到
  10. 山东大学青岛校区,拟筹建工业互联网国家重点实验室!