java clh_浅谈Java AQS实现——CLH锁
在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锁相关推荐
- java fork_浅谈Java的Fork/Join并发框架
前几天有写到整合并发结果的文章,于是联想到了Fork/Join.因为在我看来整合并发结果其实就是Fork/Join中的Join步骤.所以今天我就把自己对Fork/Join一些浅显的理解记录下来. 1. ...
- 【Java】浅谈Java的I/O体系
文章目录 流(Stream) 流的分类 java.io.* I/O体系的四大抽象类 流的分类总结表 流的层次结构图 字节输入流的层次结构图 字节输出流的层次结构图 字符输入流的层次结构图 字符输出流的 ...
- 【Java】浅谈Java的GUI开发
GUI是什么? 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面. 图形用户界面是一种人与计算机通信的界面显示格 ...
- java什么是枚举_【JAVA】浅谈java枚举类
一.什么情况下使用枚举类? 有的时候一个类的对象是有限且固定的,这种情况下我们使用枚举类就比较方便? 二.为什么不用静态常量来替代枚举类呢? public static final int SEASO ...
- java synthetic_浅谈Java编程中的synthetic关键字
导读 正文 java synthetic关键字.有synthetic标记的field和method是class内部使用的,正常的源代码里不会出现synthetic field.小颖编译工具用的就是ja ...
- java memento_浅谈Java设计模式——备忘录模式(Memento)
一.概述 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.它实现了对信息的封装,使得客户不需要关心状态保存的细节.保存就要消耗资源 ...
- java mediator_浅谈Java设计模式——中介者模式(Mediator)
一.概述 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互.中介对象用来封装对象之间的关系,各个对象可以不需要知道具体的信息 ...
- 解耦 多态性 java_Java的多态浅谈,Java多态浅谈网站安全分享!
Java的多态浅谈概述Java的四大基本特性:抽象,封装,继承和多态.其中,抽象,封装,继承可以说多态的基础,而多态是封装,继承的具体表现.如果非要用专业术语来描述什么是多态的话 多态是指程序中定义的 ...
- java 中的单元测试_浅谈Java 中的单元测试
单元测试编写 Junit 单元测试框架 对于Java语言而言,其单元测试框架,有Junit和TestNG这两种, 下面是一个典型的JUnit测试类的结构 package com.example.dem ...
- java的byte php_java_浅谈java的byte数组的不同写法,(由于篇幅原因阐述的不够详 - phpStudy...
浅谈java的byte数组的不同写法 (由于篇幅原因阐述的不够详细科学,不喜勿喷). 经常看到java中对byte数组的不同定义,粗略整理的一下: 一个字节(byte)=8位(bit),"b ...
最新文章
- asp.net 后台事件掉用前台js
- 【Web安全】利用burp抓包和CSRF伪造进入admin真实后台
- Python的XML解析!
- Opencv学习笔记(六)SURF学习笔记
- ios 上传图片失败 小程序_微信小程序ios端 使用ajaxSubmit上传图片失败,android没问题...
- 经常见到的监控摄像机的镜头
- Flash/Flex学习笔记(26):AS3自定义右键菜单
- 等压线上怎么画风向_如何利用等压线图判定天气
- JSP注册验证功能的实现
- ios模拟器 安装ipa_用iOS模拟器安装App的方法
- apkg格式怎么打开_干货:pdf转换器简单、好用,还能在线互转文件格式
- vue 直接访问静态图片_在使用vue中实现本地静态图片路径(详细教程)
- Meta-learning algorithms for Few-Shot Computer Vision论文解读(一)
- java 生成短链接_java调用百度API生成短链接(一)
- 感恩节(Thanksgiving Day)与感恩(组图)
- [MicroPython]STM32F407开发板DIY声光控开关
- C51模拟PS2键盘(三)
- 电视卡播放软件测试初学者,教你用最简单的方法解决本地电脑共享3D高清视频卡的问题...
- utf-8与带有BOM的utf-8的区别
- 第六章: Cassandra架构--Cassandra:The Definitive Guide 2nd Edition
热门文章
- 09-Further Delays Hit Syria Chemical Weapons Disarmament
- 九州海上牧云记,电视剧节奏太慢?教你如何看全集
- java拦截通过url访问页面,必须通过登录页面访问目标页面
- 00Cascading Style Sheet
- python12306抢票_Python3.6实现12306火车票自动抢票,并短信和邮件通知
- python 汉字 简繁体 转换方法
- spin_lock_bh想到的一些事
- 顾客细分(Customer Segmentation)(转载)
- Elasticsearch Nested类型
- x86代表电脑的操作系统是32位 和 x64代表电脑的操作系统是64位