简单的来说,如果一个线程组里,能保证每个线程都能拿到锁,那么这个锁就是公平锁。相反,如果保证不了每个线程都能拿到锁,也就是存在有线程饿死,那么这个锁就是非公平锁。

一、引入概念

1、公平锁:

多个线程按照申请锁的顺序去获得锁,线程会直接进⼊队列去排队,永远都是队列的第⼀位才能得到锁。

优点:所有的线程都能得到资源,不会饿死在队列中。

缺点:吞吐量会下降很多,队列⾥⾯除了第⼀个线程,其他的线程都会阻塞,cpu唤醒阻塞线程的

开销会很⼤。

2、⾮公平锁:

多个线程去获取锁的时候,会直接去尝试获取,获取不到,再去进⼊等待队列,如果能获取到,就直接获取到锁。

优点:可以减少CPU唤醒线程的开销,整体的吞吐效率会⾼点,CPU也不必取唤醒所有线程,会减少唤起线程的数量。

缺点:可能导致队列中间的线程⼀直获取不到锁或者⻓时间获取不到锁,导致饿死。

二、Java中的实现

如何能保证每个线程都能拿到锁呢,队列FIFO是一个完美的解决方案,也就是先进先出,java的ReenTrantLock也就是用队列实现的公平锁和非公平锁。

在公平的锁中,如果有另一个线程持有锁或者有其他线程在等待队列中等待这个所,那么新发出的请求的线程将被放入到队列中。而非公平锁上,只有当锁被某个线程持有时,新发出请求的线程才会被放入队列中(此时和公平锁是一样的)。所以,它们的差别在于非公平锁会有更多的机会去抢占锁。

1、公平获取锁

java.util.concurrent.locks.ReentrantLock$FairSync.javaprotected final boolean tryAcquire( int acquires) {final Thread current = Thread.currentThread();int c = getState();//状态为0,说明当前没有线程占有锁if (c ==  0 ) {//如果当前线程是等待队列的第一个或者等待队列为空,则通过cas指令设置state为1,当前线程获得锁if (isFirst(current) &&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 ;
}

2、非公平获取锁

java.util.concurrent.locks.ReentrantLock$Sync.javafinal boolean nonfairTryAcquire(int acquires) {final Thread current = Thread.currentThread();int c = getState();if (c == 0) {//如果当前没有线程占有锁,当前线程直接通过cas指令占有锁,无视等待队列,就算自己排在队尾也是这样if (compareAndSetState(0, acquires)) {setExclusiveOwnerThread(current);return true;}}else if (current == getExclusiveOwnerThread()) {int nextc = c + acquires;if (nextc < 0) // overflowthrow new Error("Maximum lock count exceeded");setState(nextc);return true;}return false;}

三、适用场景

更多的是直接使用非公平锁:非公平锁比公平锁性能高5-10倍,因为公平锁需要在多核情况下维护一个队列,如果当前线程不是队列的第一个无法获取锁,增加了线程切换次数。

JAVA并发篇_公平锁与非公平锁相关推荐

  1. Java并发篇_乐观锁与悲观锁

    乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展. 一.引入概念 1.悲观锁 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次 ...

  2. Java并发篇_线程详解

    线程(thread) 是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务 ...

  3. Java并发篇_进程线程

    一个进程包括由操作系统分配的内存空间,包含一个或多个线程.一个线程不能独立的存在,它必须是进程的一部分.一个进程一直运行,直到所有的非守护线程都结束运行后才能结束. 多线程能满足程序员编写高效率的程序 ...

  4. reentrantlock非公平锁不会随机挂起线程?_【原创】Java并发编程系列16 | 公平锁与非公平锁...

    本文为何适原创并发编程系列第 16 篇,文末有本系列文章汇总. 上一篇提到重入锁 ReentrantLock 支持两种锁,公平锁与非公平锁.那么这篇文章就来介绍一下公平锁与非公平锁. 为什么需要公平锁 ...

  5. java公平所与非公平所_一张图读懂Java非公平锁与公平锁

    前言 文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820- 种一棵树最好的时间是十年前,其次是现在 我知道很多人不玩qq了,但是怀旧一下,欢迎加入六脉神剑Ja ...

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

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

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

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

  8. java公平锁和非公平锁_java并发编程学习之再谈公平锁和非公平锁

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

  9. java并发锁有哪些,Java并发编程-公平锁与非公平锁

    写这个文章的时候让我想起了让子弹飞的一个台词 公平,公平,还是tmd公平! 什么是公平和非公平 首先,我们来看下什么是公平锁和非公平锁. 公平锁指的是按照线程请求的顺序,来分配锁: 非公平锁指的是不完 ...

最新文章

  1. 时间序列数据库——索引用ES、聚合分析时加载数据用什么?docvalues的列存储貌似更优优势一些...
  2. ios 调试的相关内容收集
  3. 7-37 图形卡片排序游戏 (40 分)
  4. js箭头函数和普通函数区别
  5. POJ 1323 Game Prediction#贪心
  6. 阿里云ECS家族再添新成员,推出密集计算型实例规格族ic5
  7. Linux:shell变量功能和Bash shell的操作环境
  8. win7 64位下 memcached安装
  9. 美团技术团队书单(通用能力篇)
  10. 如何监控电瓶车,根据交通规则推送给信息和罚单
  11. 【基于HTML技术的趣味“2048”小游戏】(效果+源代码)
  12. python实现一元三次方程求根-二分法
  13. 敏涵控股集团刘敏:一个85后创业者的民族使命
  14. ​Podman Desktop: 一款超高颜值和功能强大的 Podman 桌面管理工具
  15. 网络设备的升级与备份
  16. 小妹想学习BI,不知从何下手
  17. python strip函数用法_python中strip函数的用法
  18. request无法获取到前端发送的form表单数据
  19. 声学特征(四) pitch-yin代码实现
  20. linux系统创建用户,并赋予管理员权限

热门文章

  1. pyqt5与html数据交互原理,pyqt5与本地html进行js交互
  2. php中$stu_by,PHP基础案例二:计算学生年龄
  3. mysql如何实现管理权限分离_基于SpringCloud+vue(ElementUI)+mySQL前后端分离设计之--搭建权限管理系统...
  4. jq之fadeOut()
  5. BugkuCTF-WEB题eval
  6. android懒加载单实例,【 Android 10 设计模式 】系列 -- 单例
  7. linux下使用odbc连接mysql_Linux环境下通过ODBC访问MSSql Server
  8. 未来计算机领域最急缺的人,未来十年最紧缺职业 没人愿意干的高薪职业
  9. cad2014打开文件崩溃_CAD玩的再牛,崩溃了咋办?
  10. linux图形界面 革命,Windows 95带来的革命