在AQS源码的注释中提到AQS是CLH锁的一个变种,所以了解一下CLH锁有助于我们学习AQS。CLH锁是基于链表的、公平的的自旋锁。

这里直接贴代码(代码来自《多处理器编程的艺术》机械工业出版社)

// 这里只实现了Lock接口的部分方法

public class CLHLock implements Lock {

AtomicReference tail = new AtomicReference(new QNode());

ThreadLocal myPred;

ThreadLocal myNode;

public CLHLock() {

// 队列有一个默认的头节点

tail = new AtomicReference(new QNode());

myNode = new ThreadLocal() {

@Override

protected QNode initialValue() {

return new QNode();

}

};

myPred = new ThreadLocal() {

@Override

protected QNode initialValue() {

return null;

}

};

}

@Override

public void Lock() {

QNode qnode = myNode.get();

qnode.locked = true;

// 原子的进入队列

QNode pred = tail.getAndSet(qnode);

myPred.set(pred);

// 在前驱节点的locked字段上自旋,第一个线程则会检测默认的头节点的locked的值

while (pred.locked) {

}

}

@Override

public void Unlock() {

QNode qnode = myNode.get();

// 放弃锁,后驱节点可以继续

qnode.locked = false;

// 这个有点绕,把当前线程的myNode引用设置成队列的头节点,前线程的myNode的原引用则变成队列的头结点。前线程的myNode则会从队列中脱离。

myNode.set(myPred.get());

}

// 在书中没有给出QNode的定义

private class QNode {

// 不知道作者的原意是在这里使用volatile来实现锁的内存语义还是通过其他的方式。

public volatile boolean locked = false;

}

}

CLH锁的核心在于线程在他对应节点的前驱节点上自旋,等待前驱节点放弃锁的通知,CLH锁在NUMA系统结构下表现差也是因为此,AQS的实现与CLH锁相似的地方也在于此。在AQS中线程获取失败会进入等待队列,阻塞并等待前驱节点对应线程的唤醒。

java clh_浅谈Java AQS实现——CLH锁相关推荐

  1. java fork_浅谈Java的Fork/Join并发框架

    前几天有写到整合并发结果的文章,于是联想到了Fork/Join.因为在我看来整合并发结果其实就是Fork/Join中的Join步骤.所以今天我就把自己对Fork/Join一些浅显的理解记录下来. 1. ...

  2. 【Java】浅谈Java的I/O体系

    文章目录 流(Stream) 流的分类 java.io.* I/O体系的四大抽象类 流的分类总结表 流的层次结构图 字节输入流的层次结构图 字节输出流的层次结构图 字符输入流的层次结构图 字符输出流的 ...

  3. 【Java】浅谈Java的GUI开发

    GUI是什么? 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面. 图形用户界面是一种人与计算机通信的界面显示格 ...

  4. java什么是枚举_【JAVA】浅谈java枚举类

    一.什么情况下使用枚举类? 有的时候一个类的对象是有限且固定的,这种情况下我们使用枚举类就比较方便? 二.为什么不用静态常量来替代枚举类呢? public static final int SEASO ...

  5. java synthetic_浅谈Java编程中的synthetic关键字

    导读 正文 java synthetic关键字.有synthetic标记的field和method是class内部使用的,正常的源代码里不会出现synthetic field.小颖编译工具用的就是ja ...

  6. java memento_浅谈Java设计模式——备忘录模式(Memento)

    一.概述 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.它实现了对信息的封装,使得客户不需要关心状态保存的细节.保存就要消耗资源 ...

  7. java mediator_浅谈Java设计模式——中介者模式(Mediator)

    一.概述 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互.中介对象用来封装对象之间的关系,各个对象可以不需要知道具体的信息 ...

  8. 解耦 多态性 java_Java的多态浅谈,Java多态浅谈网站安全分享!

    Java的多态浅谈概述Java的四大基本特性:抽象,封装,继承和多态.其中,抽象,封装,继承可以说多态的基础,而多态是封装,继承的具体表现.如果非要用专业术语来描述什么是多态的话 多态是指程序中定义的 ...

  9. java 中的单元测试_浅谈Java 中的单元测试

    单元测试编写 Junit 单元测试框架 对于Java语言而言,其单元测试框架,有Junit和TestNG这两种, 下面是一个典型的JUnit测试类的结构 package com.example.dem ...

  10. java的byte php_java_浅谈java的byte数组的不同写法,(由于篇幅原因阐述的不够详 - phpStudy...

    浅谈java的byte数组的不同写法 (由于篇幅原因阐述的不够详细科学,不喜勿喷). 经常看到java中对byte数组的不同定义,粗略整理的一下: 一个字节(byte)=8位(bit),"b ...

最新文章

  1. asp.net 后台事件掉用前台js
  2. 【Web安全】利用burp抓包和CSRF伪造进入admin真实后台
  3. Python的XML解析!
  4. Opencv学习笔记(六)SURF学习笔记
  5. ios 上传图片失败 小程序_微信小程序ios端 使用ajaxSubmit上传图片失败,android没问题...
  6. 经常见到的监控摄像机的镜头
  7. Flash/Flex学习笔记(26):AS3自定义右键菜单
  8. 等压线上怎么画风向_如何利用等压线图判定天气
  9. JSP注册验证功能的实现
  10. ios模拟器 安装ipa_用iOS模拟器安装App的方法
  11. apkg格式怎么打开_干货:pdf转换器简单、好用,还能在线互转文件格式
  12. vue 直接访问静态图片_在使用vue中实现本地静态图片路径(详细教程)
  13. Meta-learning algorithms for Few-Shot Computer Vision论文解读(一)
  14. java 生成短链接_java调用百度API生成短链接(一)
  15. 感恩节(Thanksgiving Day)与感恩(组图)
  16. [MicroPython]STM32F407开发板DIY声光控开关
  17. C51模拟PS2键盘(三)
  18. 电视卡播放软件测试初学者,教你用最简单的方法解决本地电脑共享3D高清视频卡的问题...
  19. utf-8与带有BOM的utf-8的区别
  20. 第六章: Cassandra架构--Cassandra:The Definitive Guide 2nd Edition

热门文章

  1. 09-Further Delays Hit Syria Chemical Weapons Disarmament
  2. 九州海上牧云记,电视剧节奏太慢?教你如何看全集
  3. java拦截通过url访问页面,必须通过登录页面访问目标页面
  4. 00Cascading Style Sheet
  5. python12306抢票_Python3.6实现12306火车票自动抢票,并短信和邮件通知
  6. python 汉字 简繁体 转换方法
  7. spin_lock_bh想到的一些事
  8. 顾客细分(Customer Segmentation)(转载)
  9. Elasticsearch Nested类型
  10. x86代表电脑的操作系统是32位 和 x64代表电脑的操作系统是64位