何谓公平锁与非公平锁

2023-12-17 19:40
文章标签 与非 公平 何谓

本文主要是介绍何谓公平锁与非公平锁,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁
非公平锁:多个线程去获取锁的时候,会直接去尝试获取,获取不到,再去进入等待队列,如果能获取到,就直接获取到锁。

优点缺点
公平锁所有线程都会获得锁,不会饿死要唤醒阻塞的线程,CPU唤醒线程开销大
吞吐量下降
不公平锁减少CPU唤醒线程的开销
吞吐效率较高
多个线程竞争,可能由于抢不到锁导致饿死

在ReentrantLock章节,其实涉及到了公平锁与非公平锁,下面我们来回顾一下

在这里插入图片描述
我们平时new 的ReentrantLock的时候,它的底层就使用了公平锁和非公平锁

public ReentrantLock() {sync = new NonfairSync();//默认是非公平锁}
public ReentrantLock(boolean fair) {sync = fair ? new FairSync() : new NonfairSync();}

细看公平锁与非公平锁的源码,发现都继承了ReentrantLock的内部类Sync,而Sync继承AQS(AbstractQueuedSynchronizer)
公平锁与非公平锁的主要的处理逻辑在tryAcquire方法上,而唯一的不同就在于公平锁多了一个hasQueuedPredecessors方法的判断 。

    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;}}

进入hasQueuedPredecessors方法,看看是怎么一回事

   public final boolean hasQueuedPredecessors() {Node t = tail; // Read fields in reverse initialization orderNode h = head;Node s;return h != t &&((s = h.next) == null || s.thread != Thread.currentThread());}

大概意思就是判断当前线程是否是在同步队列的头部,是返回true,不是返回false
因为公平锁是同步队列的首部才可以获取锁,所以才多了一个判断,非公平锁不需要

这篇关于何谓公平锁与非公平锁的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/505600

相关文章

一些数学经验总结——关于将原一元二次函数增加一些限制条件后最优结果的对比(主要针对公平关切相关的建模)

1.没有分段的情况 原函数为一元二次凹函数(开口向下),如下: 因为要使得其存在正解,必须满足,那么。 上述函数的最优结果为:,。 对应的mathematica代码如下: Clear["Global`*"]f0[x_, a_, b_, c_, d_] := (a*x - b)*(d - c*x);(*(b c+a d)/(2 a c)*)Maximize[{f0[x, a, b,

活动系统开发之采用设计模式与非设计模式的区别-非设计模式

1、父类Base.php <?php/*** 初始化控制器* User: Administrator* Date: 2022/9/26* Time: 18:00*/declare (strict_types = 1);namespace app\controller;use app\model\common\Token;use app\BaseController;use app\B

【面试题】MySQL的聚簇索引与非聚簇索引与主键索引:深入理解与应用

文章目录 引言基础知识核心概念引擎上的区别InnoDBMyISAM 示例演示实际应用深入与最佳实践常见问题解答结语学习资源互动环节 引言 聚簇索引、非聚簇索引和主键索引的有什么区别你知道吗 在数据库设计中,索引是提高查询性能的关键。MySQL中的聚簇索引和非聚簇索引是两种不同的索引类型,它们在数据存储和检索方面有着显著的差异。理解这些差异对于优化数据库性能至关重要。 基

20210630拦截器和过滤器的区别,关系型数据库与非关系型数据库区别

一、二者理解 过滤器(Filter) 过滤器,是在java web中将你传入的request、response提前过滤掉一些信息,或者提前设置一些参数。然后再传入Servlet或Struts2的 action进行业务逻辑处理。比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入Servlet或Struts2的action前统一设置字符集,或者去除掉一些非法字

spring加载过程、spring类的单例多例与启动时懒加载与非懒加载

一句话描述spring加载过程 ClassPathXmlApplicationContext实现beanFactory接口,是一个具体的实例化工厂。服务器启动时,解析xml配置文件,将对应文件中每个bean的id作为key,属性封装到beandefinition(是个对象)作为value,封装到一个ConCurrentHashMap容器A中。  同时,还有一个ConCurrentHashMap容

c++ 或与非逻辑运算符

在 C++ 中,逻辑运算符用于处理布尔表达式的组合,常用的逻辑运算符有“与”(AND)、“或”(OR)和“非”(NOT)。它们分别是: 与(AND):&&或(OR):||非(NOT):! 下面逐一解释这些运算符的用法和特性。 1. 与(AND)运算符 && 语法:expr1 && expr2功能:只有当 expr1 和 expr2 都为真(true)时,结果才为真(true)。短路特性:如

活动系统开发之采用设计模式与非设计模式的区别-需求设计及拓展

通过活动系统流程图拆分成5个业务流程图 1、签到与滚动抽奖业务流程图 2、签到与答题领取奖品业务流程图 3、签到与抽奖业务流程图 4、答题与组团业务流程图 5、答题与美图分享业务流程图 6、总结         因业务流程相互嵌套,所以将每个系统模板化后可以动态组合目前的子业务。         a、签到-》答题-》组团         b、签到-》答题-》美

活动系统开发之采用设计模式与非设计模式的区别-需求整理

用户需求(活动系统):        1、活动类型:答题、图片展示、签到、抽奖、组团等活动          2、活动介绍:                 a、答题活动:                         第一种是签到后,随机抽取10道题,答对8到就可以抽奖;                         第二种是随机抽取一道题,不管答对还是答错,都可以进行组团报名或是

团队动力之公平启发理论

不可不知的“公平启发理论” 公平启发理论‌主要用来回答如下问题: 公平感是如何产生的。公平感会对后续行为产生什么样的影响。 公平启发理论‌描述了人们在某个给定的情境下是如何构建自己的公平信念的,核心内容可以概括为两个阶段三个效应。两个阶段是指公平判断的形成和使用两个阶段。三个效应是指主因效应、替代效应以及其他效应。 两个阶段 ‌公平判断的形成阶段‌ 人们在日常生活中的决策更符合人们的生活实际