首页
学习
活动
专区
工具
TVP
发布

公平与非公平_公平和非公平区别

公平和非公平 一、如果一个公平的,那么获取的顺序就应该符合请求的绝对顺序,即FIFO。 二、测试结果 非公平可能使线程“饥饿”,为什么它又被设定成默认的实现呢?...再次观察上表的结 果,如果把每次不同线程获取到锁定义为1次切换,公平性锁在测试中进行了10次切换,而非 公平只有5次切换,这说明非公平的开销更小。...三、,公平保证了的获取按照FIFO原则,而代价是进行大量的线程切换。非公平虽 然可能造成线程“饥饿”,但极少的线程切换,保证了其更大的吞吐量。...读写维护了一对,一个读和一个写,通过分离读和写 ,使得并发性相比一般的排他有了很大提升。...改用读写实现上述功 能,只需要在读操作时获取读,写操作时获取写即可。

30620

公平与非公平

公平:表示线程获取的顺序是按照线程启动顺序来获取的,即先来先得先进先出。 非公平:表示获取是随机获得的,先启动的也不能保证一定先获得。 下面我们用两个例子来演示一下公平与非公平。...公平 ? ? ? ? 我们看输出线程的运行顺序和线程获取的顺序是一致的。这就是公平的特征,先到先得。下面我们看一下非公平。...非公平 我们只需要将测试类中的Userinfo对象的参数为true改成false即可。 ? ?...我们看线程获取的顺序和线程的执行顺序没有什么规律,这就是非公平,不能保证,先执行的线程一定能够先获得到。...公平与非公平的区别: 公平的性能要比非公平的性能要低 ReentrantLock类默认的构造参数为false也就是默认是非公平

36530
您找到你想要的搜索结果了吗?
是的
没有找到

公平与非公平

其实好多人,在面试的时候都被问到过,可能是因为没有碰见过,在这里说一下吧,也当是为大家填一个坑 所谓公平与非公平:   如果在时间上,先对进行获取的请求,一定先被满足,这个就是公平的,不满足,...就是非公平的,就类似先到先得,就是公平的,有人插队没人管,就是非公平的 效率对比:   非公平的效率,是普遍高于公平的,因为公平,需要排队等待,会造成的挂起和唤醒,非公平不用等待,谁拿到就是谁的...,java的Synchronized和ReentrantLock默认都是非公平的 ?  ...可以看到源码中,默认的创建是,非公平 ?  ...同时在构造参数中提供了一个Boolean类型的变量,可以在创建的时候控制这个是否为公平,true就是公平,false就是非公平,相当于无参构造 作者:彼岸舞 时间:2020\11\02 内容关于

30521

公平公平可重入自旋

借此来说一下的分类: 公平: 是指多个线程按照申请的顺序来获取,每次获取时会先查看此维护的等待队列。先到先得。...非公平: 是指多个线程获取的顺序并不是按照申请的顺序,每个线程不停的去获取,直到成功,有可能后申请的线程比先申请的线程更先获取,高并发情况下,有可能造成优先级反转或者饥饿现象。...常见的非公平 synchronized/ReentrantLock(默认创建非公平new ReentrangLock(false/true)) 不填默认就是false也可以 填写true使他变为公平...可重入(递归): synchronized/ReentrantLock都是可重入 线程可以进入任何一个他已经拥有的所同步着的代码块。...可以看到结果在进入method2后获取的线程依然还是method1获取的那个线程,这就是可重入的表现。

1.2K21

JAVA并发篇_公平与非公平

简单的来说,如果一个线程组里,能保证每个线程都能拿到,那么这个就是公平。相反,如果保证不了每个线程都能拿到,也就是存在有线程饿死,那么这个就是非公平。...2、⾮公平: 多个线程去获取的时候,会直接去尝试获取,获取不到,再去进⼊等待队列,如果能获取到,就直接获取到。...二、Java中的实现 如何能保证每个线程都能拿到呢,队列FIFO是一个完美的解决方案,也就是先进先出,java的ReenTrantLock也就是用队列实现的公平和非公平。...而非公平锁上,只有当被某个线程持有时,新发出请求的线程才会被放入队列中(此时和公平是一样的)。所以,它们的差别在于非公平会有更多的机会去抢占。...:非公平公平性能高5-10倍,因为公平需要在多核情况下维护一个队列,如果当前线程不是队列的第一个无法获取,增加了线程切换次数。

18710

理解ReentrantLock的公平和非公平

那怎么实现非公平呢?查阅了一些资料,总算知道了。 首先从公平开始看起。...所以就实现了公平,根据线程发出请求的顺序获取。...总结 非公平公平的两处不同: 非公平锁在调用 lock 后,首先就会调用 CAS 进行一次抢,如果这个时候恰巧没有被占用,那么直接就获取到返回了。...非公平锁在 CAS 失败后,和公平一样都会进入到 tryAcquire 方法,在 tryAcquire 方法中,如果发现这个时候被释放了(state == 0),非公平会直接 CAS 抢,但是公平会判断等待队列是否有线程处于等待状态...公平和非公平就这两点区别,如果这两次 CAS 都不成功,那么后面非公平公平是一样的,都要进入到阻塞队列等待唤醒。 相对来说,非公平会有更好的性能,因为它的吞吐量比较大。

41850

ReentrantLock非公平公平的实现

ReentrantLock非公平公平的实现 在文章开始之前,大家复习一遍的分类: ReentrantLock是根据传入的参数来决定是否使用公平,默认使用非公平公平/非公平 当多个线程来取的时候...,按照规则排队等即为公平,不按照规则排队的即为非公平, Synchronized就是一个典型的非公平,而ReentrantLock 是根据AQS来实现线程的一个调度达到公平与非公平的一个切换.../ 大家说到ReentrantLock这个,一般情况下第一个想法是它是一个可冲入,但是我认为另一个概念公平和非公平的实现更能体现出它的内涵: //使用默认的非公平ReentrantLock nonFairReentrantLock...new FairSync() : new NonfairSync(); } 从上边代码我们看到,通过构造函数中的一个布尔入参实现具体声明公平还是非公平。...总结:ReentrantLock通过构造参数fair来判断是创建公平还是非公平,底层中的独享的实现以及队列等待功能依赖于AQS, AQS是java中大部分的基础,其中可以划分独享和共享,根据volatile

1.2K10

带你快速了解Java中的公平与非公平

公平的作用就是严格按照线程启动的顺序来执行的,不允许其他线程插队执行的;而非公平是允许插队的。...默认情况下ReentrantLock是通过非公平来进行同步的,包括synchronized关键字都是如此,因为这样性能会更好。...*/ public ReentrantLock() { sync = new NonfairSync(); } 默认状态,使用的ReentrantLock()就是非公平...,会立刻尝试配置状态,成功了就会插队执行,失败了就会和公平的机制一样,调用acquire()方法,以排他的方式来获取,成功了立刻返回,否则将线程加入队列,知道成功调用为止。...总结 上锁的过程本身也是有时间开销的,如果操作资源的时间比上锁的时间还短建议使用非公平可以提高系统的吞吐率;否则就老老实实的用公平。 最后 欢迎大家一起交流,喜欢文章记得点个赞哟,感谢支持!

78700

最全Java详解:独享共享+公平公平+乐观悲观

最全Java详解:独享/共享+公平/非公平+乐观/悲观 在Java并发场景中,会涉及到各种各样的公平,乐观,悲观等等,这篇文章介绍各种的分类: 公平/非公平 可重入...公平 VS 非公平 1.公平 就是很公平,在并发环境中,每个线程在获取时会先查看此维护的等待队列,如果为空,或者当前线程是等待队列的第一个,就占有,否则就会加入到等待队列中,以后会按照FIFO...公平的优点是等待的线程不会饿死。缺点是整体吞吐效率相对非公平要低,等待队列中除第一个线程以外的所有线程都会阻塞,CPU唤醒阻塞线程的开销比非公平大。...2.非公平 上来就直接尝试占有,如果尝试失败,就再采用类似公平那种方式。 非公平的优点是可以减少唤起线程的开销,整体的吞吐效率高,因为线程有几率不阻塞直接获得,CPU不必唤醒所有线程。...最全Java详解:独享/共享+公平/非公平+乐观/悲观 3.典型应用: java jdk并发包中的ReentrantLock可以指定构造函数的boolean类型来创建公平和非公平

59520

​AQS中的公平与非公平,Condtion

公平和非公平 Condition 1. 将节点加入到条件队列 2. 完全释放独占 3. 等待进入阻塞队列 4. signal 唤醒线程,转移到阻塞队列 5. 唤醒后检查中断状态 6....线程中断和 InterruptedException 异常 线程中断 InterruptedException 概述 处理中断 总结 公平和非公平 ReentrantLock 默认采用非公平,除非你在构造方法中传入参数...非公平锁在 CAS 失败后,和公平一样都会进入到 tryAcquire 方法,在 tryAcquire 方法中,如果发现这个时候被释放了(state == 0),非公平会直接 CAS 抢,但是公平会判断等待队列是否有线程处于等待状态...公平和非公平就这两点区别,如果这两次 CAS 都不成功,那么后面非公平公平是一样的,都要进入到阻塞队列等待唤醒。 相对来说,非公平会有更好的性能,因为它的吞吐量比较大。...当然,非公平让获取的时间变得更加不确定,可能会导致在阻塞队列中的线程长期处于饥饿状态。

60921

公平和非公平的概念和区别

公平是指多个线程按照申请的顺序来获取,类似排队打饭,先来后到。...非公平是指多个线程获取的顺序并不是按照申请的顺序,有可能后申请的线程比先申请的线程优先获取锁在高并发的情况下,有可能会造成优先级反转或者饥饿现象 并发包中ReentrantLock的创建可以指定构造函数的...boolean类型来得到公平或非公平,默认是非公平 jpa 关于其默认值,查看java.util.concurrent.Lock里的构造方法会发现如果不对其ReentranLock指定参数,...it公平,就是很公平,在并发环境中,每个线程在获取时会先查看此维护的等待队列,如果为空,或者当前线程是等待队列的第一个,就占有,否则就会加入到等待队列中,以后会按照FIFO的规则从队列中取到自己...非公平比较粗鲁,上来就直接尝试占有,如果尝试失败,就再采用类似公平那种方式。 附加 非公平的优点在于吞吐量比公平大。 对于Synchronized而言,也是一种非公平

26830

Java并发编程之独占公平与非公平比较

Java并发编程之独占公平与非公平比较 公平和非公平理解: 在上一篇文章中,我们知道了非公平。其实Java中还存在着公平呢。公平二字怎么理解呢?和我们现实理解是一样的。...本文主要内容:公平的现实生活理解;公平演示;为什么Java中默认是非公平(公平的非公平的比较) 本篇是《凯哥(凯哥Java:kagejava)并发编程学习》系列之《Lock系列》教程的第四篇:...《Java并发包下学习第五篇:公平理解及与非公平的比较》。...公平与非公平的比较 问题: 为什么并发大师Doug Lea把ReentrantLock设计默认模式是非公平的? 其实要回答这个问题,就需要从公平与非公平的不同来进行比较了。...从中我们可以看出公平和非公平的优缺点了。 优缺点比较: 非公平: 优点:效率高;缺点:容易导致线程“饥饿”。

34300

面试被问ReentrantLock的公平与非公平

面试被问ReentrantLock的公平与非公平的区别以及实现。 建议先阅读Java中的原理、优化、CAS、AQS,看这篇就对了!...这两个类也就是我们所说的公平与非公平。 还可以通过手动设置公平与非公平 public ReentrantLock(boolean fair) { sync = fair ?...总结 公平和非公平只有两处不同: 非公平锁在调用 lock 后,首先就会调用 CAS 进行一次抢,如果这个时候恰巧没有被占用,那么直接就获取到返回了。...非公平锁在 CAS 失败后,和公平一样都会进入到 tryAcquire 方法,在 tryAcquire 方法中,如果发现这个时候被释放了(state == 0),非公平会直接 CAS 抢,但是公平会判断等待队列是否有线程处于等待状态...公平和非公平就这两点区别,如果这两次 CAS 都不成功,那么后面非公平公平是一样的,都要进入到阻塞队列等待唤醒。 相对来说,非公平会有更好的性能,因为它的吞吐量比较大。

57710

图解ReentrantLock底层公平和非公平实现原理

在面试或者日常开发当中,经常会遇到公平和非公平的概念。两者最大的区别如下?1️⃣ 公平:N个线程去申请时,会按照先后顺序进入一个队列当中去排队,依次按照先后顺序获取。...:公平和非公平锁在ReentrantLock类当中怎样实现的。?ReentrantLock内部实现的公平类是FairSync,非公平类是NonfairSync。...当ReentrantLock以无参构造器创建对象时,默认生成的是非公平对象NonfairSync,只有带参且参数为true的情况下FairSync,才会生成公平,若传参为false时,生成的依然是非公平...这里就呼应前文提到的非公平的概念——当N个线程去申请非公平,它们会直接去竞争,若能获取就直接占有,获取不到,再进入队列排队顺序等待获取。...这块内容涉及比较复杂的双向链表逻辑,我后面会另外写一篇文章深入分析,本文主要是讲解公平和非公平的区别科普。

1.1K100

Apache ZooKeeper - 使用ZK实现分布式(非公平公平共享 )

---- 什么是分布式 什么是分布式,以及分布式锁在日常工作的使用场景。明确了这些,我们才能设计出一个安全稳定的分布式。 在日常开发中,我们最熟悉也常用的分布式场景是在开发多线程的时候。...---- 共享 另一种分布式的类型是共享。它在性能上要优于排他,这是因为在共享的实现中,只对数据对象的写操作加锁,而不为对象的读操作进行加锁。...创建 首先,我们通过在 ZooKeeper 服务器上创建数据节点的方式来创建一个共享。其实无论是共享还是排他,在的实现方式上都是一样的。...---- 方案一 非公平方案 ? ? ?...如何避免呢,我们看下面这种方式 ---- 方案二 公平方案 ? 上述方案是一个公平的实现,通过zk提供的临时顺序节点,可以避免同时多个节点的并发竞争,缓解了服务端压力,避免羊群效应。

1.1K10

【原创】Java并发编程系列16 | 公平与非公平

上一篇提到重入 ReentrantLock 支持两种公平与非公平。那么这篇文章就来介绍一下公平与非公平。 为什么需要公平? ReentrantLock 如何是实现公平和非公平的?...公平和非公平又都有什么优缺点呢? 1....公平和非公平的实现 温馨提示:在理解了上一篇 AQS 实现 ReentrantLock 的原理之后,学习公平和非公平的实现会很容易。...ReentrantLock 在构造时,就已经选择好是公平还是非公平了,默认是非公平。...非公平不管同步队列中是什么情况,直接去抢。 3. 公平 VS 非公平公平有可能导致线程永远无法获取到,造成饥饿现象。

66420

面试突击46:公平和非公平有什么区别?

公平的角度来说,Java 中的总共可分为两类:公平和非公平。但公平和非公平有哪些区别?孰优孰劣呢?在 Java 中的应用场景又有哪些呢?接下来我们一起来看。...正文 公平:每个线程获取的顺序是按照线程访问的先后顺序获取的,最前面的线程总是最先获取到。 非公平:每个线程获取的顺序是随机的,并不会遵循先来先得的规则,所有线程会竞争获取。...公平和非公平的性能测试结果如下,以下测试数据来自于《Java并发编程实战》: 从上述结果可以看出,使用非公平的吞吐率(单位时间内成功获取的平均速率)要比公平高很多。...总结 在 Java 语言中,的默认实现都是非公平,原因是非公平的效率更高,使用 ReentrantLock 可以手动指定其为公平。...非公平注重的是性能,而公平注重的是资源的平均分配,所以我们要选择合适的场景来应用二者。

25230
领券