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 线程公平锁与非公平锁详解及实例代码相关推荐

  1. java架构升级_java架构之路(多线程)synchronized详解以及锁的膨胀升级过程

    上几次博客,我们把volatile基本都说完了,剩下的还有我们的synchronized,还有我们的AQS,这次博客我来说一下synchronized的使用和原理. synchronized是jvm内 ...

  2. u盘锁电脑_如何给u盘设置密码 给u盘设置密码方法【步骤详解】

    u盘是强大的数据资料存储工具,为了安全性,可以给u盘设置密码,这样u盘插入电脑后需要正确输入才能启用,下面来看看u盘怎么设置密码. 1.将u盘插入电脑usb接口,找到u盘盘符并右键点击该u盘,点击启用 ...

  3. ReentrantLock之公平锁和非公平锁详解

    ReentrantLock是一个互斥锁,它具有synchronized相同的能力:但相比之下,ReentrantLock扩展性更强,比如实现了公平锁. 下面详细拆解下ReentrantLock的公平锁 ...

  4. 公平锁和非公平锁的详解

    公平锁 加锁时考虑排队等待问题,按照申请锁的顺序,按照FIFO规则,先申请的线程先取得锁,其他线程进入队列等待锁的释放,当锁释放后,在队头的线程被唤醒. 非公平锁 加锁时不考虑排队等待问题,直接尝试获 ...

  5. 存储过程没有执行完后没有释放锁_【大厂面试07期】说一说你对synchronized锁的理解?...

    PS:本文已收录到1.3 K+ Star 数的开源项目-<大厂面试指北>,如果想要了解更多,可以看一看,项目地址如下: https://github.com/NotFound9/inter ...

  6. 读写自旋锁详解:TODO

    林 昊翔 2011 年 7 月 21 日发布 Table of Contents 读写自旋锁简介 什么是读写自旋锁 读写自旋锁的属性 以自动机的观点看读写自旋锁 读写自旋锁的实现细节 读写自旋锁的接口 ...

  7. 一文详解 Java 的几把 JVM 级锁

    作者 | 楚昭 来源 | 阿里巴巴中间件(ID:Aliware_2018) 在计算机行业有一个定律叫"摩尔定律",在此定律下,计算机的性能突飞猛进,而且价格也随之越来越便宜, CP ...

  8. java中的CAS操作以及锁机制详解

    关于CAS操作 CAS:Compare And Swap   --  乐观锁策略 CAS(无锁操作):使用CAS叫做比较交换来判断是否出现冲突,出现冲突就重试当前操作直到不冲突为止. 悲观锁(JDK1 ...

  9. java中间件登陆超时_一文详解 Java 的几把 JVM 级锁

    作者 | 楚昭 来源 | 阿里巴巴中间件(ID:Aliware_2018) 在计算机行业有一个定律叫"摩尔定律",在此定律下,计算机的性能突飞猛进,而且价格也随之越来越便宜, CP ...

最新文章

  1. 通过这个故事理解啥是 NIO
  2. word List 13
  3. linux uboot启动流程分析,uboot启动流程分析
  4. Pragma是什么?
  5. 解决conda activate报错IMPORTANT: You may need to close and restart your shell after running ‘conda init‘
  6. 从程序员到项目经理(四):外行可以领导内行吗
  7. 年度影像旗舰vivo X70系列正式发布 售价3699元起
  8. Memory Networks论文串烧
  9. 层次分析法模型及代码
  10. ROS教程之ROS问题集
  11. 104规约使用总结(三)——报文解析
  12. SAP:SMARTFORM打开WORD文档出错,或无法编辑
  13. “客户机操作系统已将 CD-ROM 门锁定,并且可能正在使用 CD-ROM,这可能会导致客户机...” 报错解决办法
  14. 会议 | 百度首席科学家吴华图灵大会演讲:NLP技术的演变与发展
  15. cpu超线程优缺点_CPU有无超线程重要吗?i7 10700K与9700K对比测试
  16. scp远程传输文件之权限被拒绝解决方案
  17. ffmpeg里转场transition
  18. ccf计算机认证考试题集,【计算机本科补全计划】CCF计算机职业资格认证 2017-03 试题初试...
  19. 自己动手写H3C校园网登录客户端(Linux平台版)
  20. ECC功能简述及其原理

热门文章

  1. Android studio 二维码扫描的实现
  2. win10安装redis以及redis安装包下载附带redisdesktopmanager
  3. 办理上海居住证资料__网址
  4. 机甲大师s1 python_大疆机甲大师S1,可视化模块编程机器人
  5. zabbix3.4安装
  6. Unity3D Shader系列之渲染流水线
  7. MCN公会电商抖音主播话术技巧脚本方案资料模板ppt
  8. 在unity3d中安装Tstrain tools
  9. 四大组件以及 Application和Context的全面理解
  10. String的intern方法演示及各种字符串的拼接对比