在java并发编程学习之显示锁Lock里有提过公平锁和非公平锁,我们知道他的使用方式,以及非公平锁的性能较高,在AQS源码分析的基础上,我们看看NonfairSync和FairSync的区别在什么地方。

lock方法

//非公平锁NonfairSync

final void lock() {

if (compareAndSetState(0, 1))

setExclusiveOwnerThread(Thread.currentThread());

else

acquire(1);

}

//公平锁FairSync

final void lock() {

acquire(1);

}

从源码可以看出,获取锁的时候,非公平锁会先尝试获取,获取不到再调用acquire方法,而公平锁直接调用acquire方法。

tryAcquire方法

非公平锁NonfairSync

protected final boolean tryAcquire(int acquires) {

return nonfairTryAcquire(acquires);

}

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;

}

公平锁FairSync

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;

}

从源码可以看出,公平锁再尝试获取锁的时候,先判断队列是否有其他节点在等待,没有再获取。而非公平锁直接尝试获取锁。

java公平锁和非公平锁_java并发编程学习之再谈公平锁和非公平锁相关推荐

  1. java中解决脏读_java并发编程学习之脏读代码示例及处理

    使用interrupt()中断线程     当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即 ...

  2. java框内的值怎么同步_java并发编程使用锁进行数据同步操作一

    项目中总是出现招标项目超投的情况,最开始总是觉得应该使用框架Hibernate自带的并发策略中的乐观锁(version)解决问题,参考了很多网上的资料,也参考了Hibernate的帮助文档,由于对Hi ...

  3. java并发进程共享变量_JAVA并发编程学习:共享对象

    可见性 在一个单线程程序中,如果向一个变量先写入值,然后在没有写干涉的情况下读取这个变量,会得到相同的返回值.但是当读和写发生在不同的线程中时,就不能保证读线程及时地读取其他线程写入的值.在JAVA中 ...

  4. java 对象 线程安全_JAVA并发编程学习:构造线程安全的对象

    设计线程安全的类 实例限制 当一个对象被另一个对象封装时,所有访问被被封装对象的代码路径就是全部可知的,这相比于让对象可被整个系统访问来说,更容易对代码路径进行分析.将数据封装在对象内部,把对数据的访 ...

  5. java投票锁_Java并发编程锁之独占公平锁与非公平锁比较

    Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁.其实Java中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家去排队本着先来 ...

  6. java 共享锁 独占锁_Java并发编程锁之独占公平锁与非公平锁比较

    Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁.其实Java中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家取排队本着先来 ...

  7. java lock 对象_Java并发编程锁系列之ReentrantLock对象总结

    Java并发编程锁系列之ReentrantLock对象总结 在Java并发编程中,根据不同维度来区分锁的话,锁可以分为十五种.ReentranckLock就是其中的多个分类. 本文主要内容:重入锁理解 ...

  8. java并发编程学习一

    java并发编程学习一 什么是进程和线程? 进程是操作系统进行资源分配的最小单位 进程跟进程之间的资源是隔离的,同一个进程之中的线程可以共享进程的资源. 线程是进程的一个实体,是CPU 调度和分派的基 ...

  9. Java高并发编程学习(三)java.util.concurrent包

    简介 我们已经学习了形成Java并发程序设计基础的底层构建块,但对于实际编程来说,应该尽可能远离底层结构.使用由并发处理的专业人士实现的较高层次的结构要方便得多.要安全得多.例如,对于许多线程问题,可 ...

最新文章

  1. 移动机器人路径规划---深蓝学院培训学习记录
  2. 一条mysql分组查询的问题分析
  3. 谁参加了JavaScript 2018状况调查?
  4. 参考平面及其高度_柱面及其方程
  5. 用mac的safari浏览器调试ios手机的网页
  6. 软件测试--中间件介绍
  7. 转载椭圆曲线原理和openssl命令操作
  8. nginx下apk下载,ie9的问题
  9. Linux服务器时间校准
  10. 什么是死亡之 Ping 攻击?
  11. 小米禁止android系统联网,解决MIUI下新安装应用无法联网的问题
  12. excel图片根据表格内容动态变化
  13. kappa一致性检验教程_R语言中的试验一致性检验分析 kappa检验和McNemar检验
  14. “FCoE全解系列”之网络融合交换机类型
  15. 银行mysql面试题_mysql的常见面试题
  16. “中国年龄最小的黑客”汪正扬资料介绍 写编程代码曾敲坏电脑
  17. 大疆 芯片开发 面经
  18. 《我也能做CTO之程序员职业规划》之十六:逆商
  19. 单词快速记忆day40
  20. Android 自定义折线图实现教程

热门文章

  1. 换种思维看互联网公司分配时间!
  2. 开源技术、开放使用、业务导向的大数据平台,助力银行数字化转型
  3. 刷爆抖音,4万好评!这本 Python 3.6 的书又断货了...
  4. 十步教你如何接手别人的代码!
  5. 第二届字节跳动夏令营启动全球报名,图灵奖得主授课
  6. 2019 年容器安全最新现状研究报告:意识普遍低,责任归属难!
  7. 飞机上终于能开着手机连 Wi-Fi 了,它背后的技术原理是什么?
  8. 带你全面掌握高级知识点!java修改map中的value
  9. 安徽工程大学专升本计算机科学与技术专业,2015年安徽工程大学机电学院的计算机科学与技术专业怎么样...
  10. linux nginx vue_Vue-CLI 3.x 部署项目至生产服务器