公平锁与非公平锁源码对比
语义:
1.公平锁:每个线程在获取锁的时候,会先检查该锁维护的等待队列,如果该队列是空或者当前线程是第一个,则占有锁,否则按照FIFO的原则,进入等待队列,等待获取锁;
2.非公平锁:当前线程在获取锁的时候,不管该锁的维护队列种是否有其它等待线程,直接CAS,如果cas失败,则再执行公平锁的那一套;
源码比较如下:
公平锁:
final void lock() {acquire(1);}
非公平锁:
final void lock() {if (compareAndSetState(0, 1)) //先尝试获取锁setExclusiveOwnerThread(Thread.currentThread());elseacquire(1);//获取锁失败,再采用公平锁的方式;}
关于锁的释放,公平锁与非公平锁是一样的:
public final boolean release(int arg) {if (tryRelease(arg)) {Node h = head;if (h != null && h.waitStatus != 0)unparkSuccessor(h);return true;}return false;}
关于公平锁与非公平锁的更底层的一些东西,比如volatile的使用,因为涉及到native方法,暂时没有深究。
转载于:https://www.cnblogs.com/zqsky/p/7899195.html
公平锁与非公平锁源码对比相关推荐
- ReentrantLock 公平锁和非公平锁加锁和解锁源码分析(简述)
- title: ReentrantLock 公平锁和非公平锁加锁和解锁源码分析(简述) - date: 2021/8/16 文章目录 一.ReentrantLock 1. 构造函数 二.Reentr ...
- 闲聊AQS面试和源码解读---可重入锁、LockSupport、CAS;从ReentrantLock源码来看公平锁与非公平锁、AQS到底是怎么用CLH队列来排队的?
AQS原理可谓是JUC面试中的重灾区之一,今天我们就来一起看看AQS到底是什么? 这里我先整理了一些JUC面试最常问的问题? 1.Synchronized 相关问题以及可重入锁 ReentrantLo ...
- java公平所与非公平所_一张图读懂Java非公平锁与公平锁
前言 文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820- 种一棵树最好的时间是十年前,其次是现在 我知道很多人不玩qq了,但是怀旧一下,欢迎加入六脉神剑Ja ...
- 深入分析ReentrantLock公平锁和非公平锁的区别 (转)
在ReentrantLock中包含了公平锁和非公平锁两种锁,通过查看源码可以看到这两种锁都是继承自Sync,而Sync又继承自AbstractQueuedSynchronizer,而AbstractQ ...
- ReentrantLock与公平锁、非公平锁实现
前言 最近开始读JDK源码,所有心得准备总结成一个专栏,JDK Analysis系列的第一篇,就从万众瞩目的ReentrantLock开始吧,而谈到ReentrantLock,就不得不说AQS,它是 ...
- 【JUC并发编程06】多线程锁 (公平锁和非公平锁,死锁,可重锁)
文章目录 6 多线程锁 (公平锁和非公平锁,死锁,可重锁) 6.1 synchronized 锁的八种情况 6.2 对上述例子的总结 6.3 公平锁和非公平锁 6.4 可重入锁 6.5 死锁 6 多线 ...
- Java进阶:ReentrantLock实现原理解析(公平锁、非公平锁、可重入锁、自旋锁)
概述 本篇将介绍公平锁.非公平锁.可重入锁.自旋锁相关理论知识,同时结合相关源码和Demo进行解析,主要是以ReentrantLock作为例子. 公平锁 公平锁定义 公平锁是指线程按照申请所的顺序来获 ...
- kali锁屏后无法唤醒_面试官:说一下公平锁和非公平锁的区别?
前言 上次我们提到了乐观锁和悲观锁,那我们知道锁的类型还有很多种,我们今天简单聊一下,公平锁和非公平锁两口子,以及他们在我们代码中的实践. 正文 开始聊之前,我先大概说一下他们两者的定义,帮大家回顾或 ...
- reentrantlock非公平锁不会随机挂起线程?_【原创】Java并发编程系列16 | 公平锁与非公平锁...
本文为何适原创并发编程系列第 16 篇,文末有本系列文章汇总. 上一篇提到重入锁 ReentrantLock 支持两种锁,公平锁与非公平锁.那么这篇文章就来介绍一下公平锁与非公平锁. 为什么需要公平锁 ...
最新文章
- vasp算表面吸附流程_VASP实例分析表面吸附计算
- 分布式存储的三个基本问题
- 为什么 Go 模块在下游服务抖动恢复后,CPU 占用无法恢复
- ABAP Netweaver和Cloud Foundry上的环境变量Environment Variable
- content-type对照表
- AcWing.282石子合并(区间DP)题解
- ySQL性能优化的21个最佳实践 和 mysql使用索引
- scrapy -selector
- RK3568-ANDROID11-4G-EC20-驱动篇(移远模块)
- image.getSubimage(x, y, width, height)函数解析
- Graph Meta Network for Multi-Behavior Recommendation精读
- 高性能服务器设计——常用网络服务器设计模型
- c语言中calloc是什么意思,C语言中malloc和calloc以及relloc函数的区别
- 缓存击穿和雪崩常用解决方案
- 英语笔记(单词来自Shiro文档)02
- 《个人金融信息保护技术规范》JRT 0171-2020专家解读(转自中国存储网)
- #入坑keychron#Macbook外置机械键盘的不二之选-keychron
- 多可系统如何增加新用户到工作组
- 酷开与鸿蒙哪个好用,上手说说创维电视与酷开有区别没有?哪个好?老司机透漏评测...
- Xilinx ZYNQ开发板资料共享
热门文章
- 海龟绘图画花朵_我家宝宝最喜欢的一本图画书——我的连衣裙
- fastadmin弹框提示不起作用 confirm
- ubuntu 更新软件
- HMM、MEMM、CRF模型比较和标注偏置问题(Label Bias Problem)
- Atitit. atiJavaExConverter4js 新的特性
- 念 2013-8-6 (写于爸爸走之后,之七)
- (转)编写可重入和线程安全的代码(Writing Reentrant and Thread-Safe Code)
- 此心拖泥带水,是人生最苦处
- java B2B2C springmvc mybatis电子商务平台源码-Spring Cloud Security
- 前线观察 | AWS re:Invent 2018见闻实录