关闭

ReentrantLock之公平锁与非公平锁浅析

5374人阅读 评论(2) 收藏 举报
分类:
   在Java的ReentrantLock构造函数中提供了两种锁:创建公平锁和非公平锁(默认)。代码如下:

public ReentrantLock() {

       sync = new NonfairSync();

}

 public ReentrantLock(boolean fair) {
          sync = fair ? new FairSync() : new NonfairSync();
    }

在公平的锁上,线程按照他们发出请求的顺序获取锁,但在非公平锁上,则允许‘插队’:当一个线程请求非公平锁时,如果在发出请求的同时该锁变成可用状态,那么这个线程会跳过队列中所有的等待线程而获得锁。     非公平的ReentrantLock 并不提倡 插队行为,但是无法防止某个线程在合适的时候进行插队。

在公平的锁中,如果有另一个线程持有锁或者有其他线程在等待队列中等待这个所,那么新发出的请求的线程将被放入到队列中。而非公平锁上,只有当锁被某个线程持有时,新发出请求的线程才会被放入队列中。

非公平锁性能高于公平锁性能的原因:

在恢复一个被挂起的线程与该线程真正运行之间存在着严重的延迟。

假设线程A持有一个锁,并且线程B请求这个锁。由于锁被A持有,因此B将被挂起。当A释放锁时,B将被唤醒,因此B会再次尝试获取这个锁。与此同时,如果线程C也请求这个锁,那么C很可能会在B被完全唤醒之前获得、使用以及释放这个锁。这样就是一种双赢的局面:B获得锁的时刻并没有推迟,C更早的获得了锁,并且吞吐量也提高了。

当持有锁的时间相对较长或者请求锁的平均时间间隔较长,应该使用公平锁。在这些情况下,插队带来的吞吐量提升(当锁处于可用状态时,线程却还处于被唤醒的过程中)可能不会出现。

3
3
查看评论

Java中的公平锁和非公平锁实现详解

Java语言中有许多原生线程安全的数据结构,比如`ArrayBlockingQueue`、`CopyOnWriteArrayList`、,它们的实现方式并非通过`synchronized`关键字,而是通过`java.util.concurrent.locks.ReentrantLock`来实现。 ...
  • qyp199312
  • qyp199312
  • 2017-04-24 16:09
  • 1956

深入剖析ReentrantLock公平锁与非公平锁源码实现

本文以公平与非公平锁的加锁缩成为主线,分析整个加锁过程。准备知识简介ReentrantLock类图: NonfairSync继承关系: Node结点:作为获取锁失败线程的包装类, 组合了Thread引用, 实现为FIFO双向队列。 下图为Node结点的属性描述 锁的...
  • lsgqjh
  • lsgqjh
  • 2017-03-19 15:29
  • 1778

ReentrantLock之公平锁与非公平锁浅析

在Java的ReentrantLock构造函数中提供了两种锁:创建公平锁和非公平锁(默认)。代码如下: public ReentrantLock() {        sync = new NonfairSync(); }...
  • zmx729618
  • zmx729618
  • 2016-06-06 10:28
  • 5374

Java中公平锁与非公平锁的区别

所谓公平锁指的是哪个线程先运行,那就可以先得到锁。非公平锁是不管线程是否是先运行,都是随机获得锁的。 看下代码就清楚了。 package FairAndUnFailLock; public class TestMain { public TestMain() { } ...
  • wangyan199366
  • wangyan199366
  • 2016-07-13 10:46
  • 4689

公平锁与非公平锁

在ReentrantLock中很明显可以看到其中同步包括两种,分别是公平的FairSync和非公平的NonfairSync。公平锁的作用就是严格按照线程启动的顺序来执行的,不允许其他线程插队执行的;而非公平锁是允许插队的。默认情况下ReentrantLock是通过非公平锁来进行同步的,包括synch...
  • EthanWhite
  • EthanWhite
  • 2017-02-17 13:32
  • 6854

java多线程的公平锁和非公平锁

java多线程 ReentrantLock.lock 公平锁 非公平锁。
  • yoyolity
  • yoyolity
  • 2016-04-17 21:56
  • 254

java之ReentrantLock公平锁和非公平锁

大多数情况下,大家可能都会选择使用synchronized来加锁,ReentrantLock确实是一种高级加锁工具,在确实需要一些 synchronized 所没有的特性的时候,比如时间锁等候、可中断锁等候、无块结构锁、多个条件变量或者锁投票。 以下实现公平锁和非公平锁,公平锁在性能上会多消耗点 p...
  • qq_22929803
  • qq_22929803
  • 2016-05-19 23:31
  • 4805

公平锁 非公平锁 使用场景

公平锁 非公平锁 使用场景. 公平与非公平 这个概念是针对锁的获取的,在绝对时间上,先对锁进行获取的请求一定先满足,那么这个锁是公平的,反之就是不公平的。公平锁的获取就是等待时间最长的线程最先获取锁,也就是锁获取是顺序的。但是公平锁的机制往往效率不高。 但是非公平锁有可能导致:一直获取不到锁...
  • fei33423
  • fei33423
  • 2017-04-28 15:31
  • 393

公平锁和非公平锁

转载于《Java多线程核心技术》 定义: 公平锁:按照线程加锁的顺序来分配,即先来先得FIFO; 非公平锁:一种获取锁的抢占机制,是随机的获得锁的,这样可能会有些线程一直会拿不到锁,结果也就是不公平的。 1.公平锁实例代码: package test.Thread4; import...
  • ycd500756
  • ycd500756
  • 2018-01-11 10:53
  • 25

4.1.9ReentrantLock的公平锁与非公平锁

公平锁:表示线程获得锁的顺序是按照线程的启动顺序的分配的,即先来先得(FIFO)。 非公平锁:表示获取锁是随机的,先启动的线程不一定先获得锁。 先看公平锁的栗子: package demo; import java.util.concurrent.locks.Condition; import ...
  • mrsyf
  • mrsyf
  • 2017-10-18 23:13
  • 59
    个人资料
    • 访问:1637954次
    • 积分:18344
    • 等级:
    • 排名:第615名
    • 原创:155篇
    • 转载:913篇
    • 译文:34篇
    • 评论:222条
    文章分类
    最新评论