关于ReetrantLock
ReetrantLock 内部静态类 Sync 继承AbstractQueuedSynchronizer(负责阻塞队列,线程去枪战锁,并且包含了node)
NonfairSync extends Sync extends AbstractQueuedSynchronizer
FairSync extends Sync extends AbstractQueuedSynchronizer
AbstractQueuedSynchronizer 中有一个模板方法 tryacquire(模板模式)
非公平锁NonfairSync
final void lock() {
//直接枪占啊。基于cas保证state操作在并发的时候是正确的
if (compareAndSetState(0, 1))
setExclusiveOwnerThread(Thread.currentThread());
else
acquire(1);
}
公平锁FairSync
final void lock() {
acquire(1);
}
acquire的方法 是在AbstractQueuedSynchronizer中实现的
public final void acquire(int arg) {
//addWaiter是加入到队列尾巴 吧线程封装成node acquireQueued里面又做了循环。所有线程去抢占锁。至于里面的对线程的状态的切换不用关系
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
}
tryAcquire 在AbstractQueuedSynchronizer 只是实现了个方法
protected boolean tryAcquire(int arg) {
throw new UnsupportedOperationException();
}
具体的实现分别在NonfairSync FairSync
前者
final boolean nonfairTryAcquire(int acquires) {
final Thread current = Thread.currentThread();
int c = getState();
if (c == 0) {
if (compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);
return true;
}
}
else if (current == getExclusiveOwnerThread()) {
int nextc = c + acquires;
if (nextc < 0) // overflow
throw new Error("Maximum lock count exceeded");
setState(nextc);
return true;
}
return false;
}
后者
protected final boolean tryAcquire(int acquires) {
final Thread current = Thread.currentThread();
int c = getState();
if (c == 0) {
//判断当前线程是否是队列头 保证了按顺序
if (!hasQueuedPredecessors() &&
compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);
return true;
}
}
else if (current == getExclusiveOwnerThread()) {
int nextc = c + acquires;
if (nextc < 0)
throw new Error("Maximum lock count exceeded");
setState(nextc);
return true;
}
return false;
}
转载于:https://www.cnblogs.com/tecnologycc/p/10174689.html
关于ReetrantLock相关推荐
- Java synchronized 与 lock (Reetrantlock)锁性能比较
使用synchronzied和ReetrantLock做一百万次自增运算性能比较,比较一个线程和多线程情况下 package com.lock.test; public class LockValue ...
- 非公平锁和公平锁在reetrantlock里的实现过程是怎样的
● 请讲一下非公平锁和公平锁在reetrantlock里的实现过程是怎样的. 考察点:锁 参考回答: 如果一个锁是公平的,那么锁的获取顺序就应该符合请求的绝对时间顺序,FIFO.对于非公平锁,只要CA ...
- synchronized,ReetrantLock与volatile(二)
为什么80%的码农都做不了架构师?>>> volatile Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性.这就是说线程能够 ...
- 深入剖析基于并发AQS的(独占锁)重入锁(ReetrantLock)及其Condition实现原理
[版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/75043422 出自[zejian ...
- ReetrantLock 源码解析(UML图版)
废话不说,上图: PS:绘图工具用的是idea插件: PlantUML integration(idea插件网上五星好评的那个.)本来想用泳道图的,但用starUML不好上手,这个插件有官方教程,语法 ...
- synchronized与ReetrantLock的区别
synchronized与ReetrantLock的区别(个人见解,如果不对,请勿喷) 相同之处: 1.两者都是同时实现了锁的功能 2.两者都是可重入锁 不同之处: (1)synchronized是独 ...
- java高并发(十四)ReetrantLock 与锁
java主要分两类锁,一种是synchronized关键字修饰的锁,另一种是J.U.C.提供的锁.J.U.C里核心锁就是ReentrantLock ReentrantLock(可重入锁)和synchr ...
- ReentrantLock与synchronized
1.ReentrantLock 拥有Synchronized相同的并发性和内存语义,此外还多了 锁投票,定时锁等候和中断锁等候线程A和B都要获取对象O的锁定,假设A获取了对象O锁,B将等待A释放对O的 ...
- Http持久连接与HttpClient连接池
以下文章来源方志朋的博客,回复"666"获面试宝典 一.背景 HTTP协议是无状态的协议,即每一次请求都是互相独立的.因此它的最初实现是,每一个http请求都会打开一个tcp so ...
最新文章
- CSS3——transform
- 库函数和系统调用的区别
- 【Spring】Spring高级话题-@Enable***注解的工作原理
- Idea中在代码顶部添加自定义作者和时间
- 笔记:Microservices for Java Developers
- 【Siddhi】Siddhi 如何表示布尔 Syntax error in SiddhiQL, mismatched input ‘boolean
- 喵哈哈村的魔法考试 Round #9 (Div.2) 题解
- [ZJOI2008]骑士
- Windows10 地平线4支持PS4手柄有线连接
- linux fifo文件,linux中的命名管道(FIFO)
- 计算机制图基本知识6,机械制图基础知识
- 002_simulink中显示模块中的名字
- SaltStack简介和安装
- 计算机word保存如何操作,如何保存WORD文档内容???急
- 【C++】struct结构体/构造函数
- 以太坊质押时代到来,开发者机遇何在?
- AI医学诊断基础-CT扫描、核磁共振成像(MRI)、拍X光、拍胸片、做B超/彩超等常规检查的介绍、原理、医学影像示例(持续跟新和答疑。。。)
- java中的开方Math.sqrt(n)函数和平方{a的b次方Math.pow(a, b)}
- GDOI2017 总结
- 【微信小程序开发】IOS与安卓样式兼容问题
热门文章
- python读取pdf文档书签 bookmark_Python利用PyPDF2库获取PDF文件总页码实例
- 和gdi绘图效率比较_堪称效率神器!5款日常插件分享,错过哪一个都无比遗憾...
- 寻找唯一特等奖java,大工斩获唯一特等奖!这次,请为我工老师疯狂打call!
- powershell 学习地址
- 22考生这些院校计算机专业改考408
- 位示图 c语言程序,位示图模拟文件系统空闲快管理c语言
- 解决IE10以下对象不支持“bind“属性或方法
- C/C++中char *与wchar_t*的几种转换方法
- Linux的system和popen的差异
- Fragment之三:根据屏幕尺寸加载不同的Fragment