公平锁非公平锁的实际使用_java 线程公平锁与非公平锁详解及实例代码
java 线程公平锁与非公平锁详解
在ReentrantLock中很明显可以看到其中同步包括两种,分别是公平的FairSync和非公平的NonfairSync。公平锁的作用就是严格按照线程启动的顺序来执行的,不允许其他线程插队执行的;而非公平锁是允许插队的。
默认情况下ReentrantLock是通过非公平锁来进行同步的,包括synchronized关键字都是如此,因为这样性能会更好。因为从线程进入了RUNNABLE状态,可以执行开始,到实际线程执行是要比较久的时间的。而且,在一个锁释放之后,其他的线程会需要重新来获取锁。其中经历了持有锁的线程释放锁,其他线程从挂起恢复到RUNNABLE状态,其他线程请求锁,获得锁,线程执行,这一系列步骤。如果这个时候,存在一个线程直接请求锁,可能就避开挂起到恢复RUNNABLE状态的这段消耗,所以性能更优化。
/**
* Creates an instance of {@code ReentrantLock}.
* This is equivalent to using {@code ReentrantLock(false)}.
*/
public ReentrantLock() {
sync = new NonfairSync();
}
默认状态,使用的ReentrantLock()就是非公平锁。再参考如下代码,我们知道ReentrantLock的获取锁的操作是通过装饰模式代理给sync的。
/**
* Acquires the lock.
*
*
Acquires the lock if it is not held by another thread and returns
* immediately, setting the lock hold count to one.
*
*
If the current thread already holds the lock then the hold
* count is incremented by one and the method returns immediately.
*
*
If the lock is held by another thread then the
* current thread becomes disabled for thread scheduling
* purposes and lies dormant until the lock has been acquired,
* at which time the lock hold count is set to one.
*/
public void lock() {
sync.lock();
}
下面参考一下FairSync和NonfairSync对lock方法的实现:
/**
* Sync object for non-fair locks
*/
static final class NonfairSync extends Sync {
/**
* Performs lock. Try immediate barge, backing up to normal
* acquire on failure.
*/
final void lock() {
if (compareAndSetState(0, 1))
setExclusiveOwnerThread(Thread.currentThread());
else
acquire(1);
}
}
/**
* Sync object for fair locks
*/
static final class FairSync extends Sync {
final void lock() {
acquire(1);
}
}
当使用非公平锁的时候,会立刻尝试配置状态,成功了就会插队执行,失败了就会和公平锁的机制一样,调用acquire()方法,以排他的方式来获取锁,成功了立刻返回,否则将线程加入队列,知道成功调用为止。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
时间: 2017-02-22
公平锁非公平锁的实际使用_java 线程公平锁与非公平锁详解及实例代码相关推荐
- java架构升级_java架构之路(多线程)synchronized详解以及锁的膨胀升级过程
上几次博客,我们把volatile基本都说完了,剩下的还有我们的synchronized,还有我们的AQS,这次博客我来说一下synchronized的使用和原理. synchronized是jvm内 ...
- u盘锁电脑_如何给u盘设置密码 给u盘设置密码方法【步骤详解】
u盘是强大的数据资料存储工具,为了安全性,可以给u盘设置密码,这样u盘插入电脑后需要正确输入才能启用,下面来看看u盘怎么设置密码. 1.将u盘插入电脑usb接口,找到u盘盘符并右键点击该u盘,点击启用 ...
- ReentrantLock之公平锁和非公平锁详解
ReentrantLock是一个互斥锁,它具有synchronized相同的能力:但相比之下,ReentrantLock扩展性更强,比如实现了公平锁. 下面详细拆解下ReentrantLock的公平锁 ...
- 公平锁和非公平锁的详解
公平锁 加锁时考虑排队等待问题,按照申请锁的顺序,按照FIFO规则,先申请的线程先取得锁,其他线程进入队列等待锁的释放,当锁释放后,在队头的线程被唤醒. 非公平锁 加锁时不考虑排队等待问题,直接尝试获 ...
- 存储过程没有执行完后没有释放锁_【大厂面试07期】说一说你对synchronized锁的理解?...
PS:本文已收录到1.3 K+ Star 数的开源项目-<大厂面试指北>,如果想要了解更多,可以看一看,项目地址如下: https://github.com/NotFound9/inter ...
- 读写自旋锁详解:TODO
林 昊翔 2011 年 7 月 21 日发布 Table of Contents 读写自旋锁简介 什么是读写自旋锁 读写自旋锁的属性 以自动机的观点看读写自旋锁 读写自旋锁的实现细节 读写自旋锁的接口 ...
- 一文详解 Java 的几把 JVM 级锁
作者 | 楚昭 来源 | 阿里巴巴中间件(ID:Aliware_2018) 在计算机行业有一个定律叫"摩尔定律",在此定律下,计算机的性能突飞猛进,而且价格也随之越来越便宜, CP ...
- java中的CAS操作以及锁机制详解
关于CAS操作 CAS:Compare And Swap -- 乐观锁策略 CAS(无锁操作):使用CAS叫做比较交换来判断是否出现冲突,出现冲突就重试当前操作直到不冲突为止. 悲观锁(JDK1 ...
- java中间件登陆超时_一文详解 Java 的几把 JVM 级锁
作者 | 楚昭 来源 | 阿里巴巴中间件(ID:Aliware_2018) 在计算机行业有一个定律叫"摩尔定律",在此定律下,计算机的性能突飞猛进,而且价格也随之越来越便宜, CP ...
最新文章
- 通过这个故事理解啥是 NIO
- word List 13
- linux uboot启动流程分析,uboot启动流程分析
- Pragma是什么?
- 解决conda activate报错IMPORTANT: You may need to close and restart your shell after running ‘conda init‘
- 从程序员到项目经理(四):外行可以领导内行吗
- 年度影像旗舰vivo X70系列正式发布 售价3699元起
- Memory Networks论文串烧
- 层次分析法模型及代码
- ROS教程之ROS问题集
- 104规约使用总结(三)——报文解析
- SAP:SMARTFORM打开WORD文档出错,或无法编辑
- “客户机操作系统已将 CD-ROM 门锁定,并且可能正在使用 CD-ROM,这可能会导致客户机...” 报错解决办法
- 会议 | 百度首席科学家吴华图灵大会演讲:NLP技术的演变与发展
- cpu超线程优缺点_CPU有无超线程重要吗?i7 10700K与9700K对比测试
- scp远程传输文件之权限被拒绝解决方案
- ffmpeg里转场transition
- ccf计算机认证考试题集,【计算机本科补全计划】CCF计算机职业资格认证 2017-03 试题初试...
- 自己动手写H3C校园网登录客户端(Linux平台版)
- ECC功能简述及其原理