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

6784人阅读 评论(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更早的获得了锁,并且吞吐量也提高了。

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

查看评论

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

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

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

本文以公平与非公平锁的加锁缩成为主线,分析整个加锁过程。准备知识简介ReentrantLock类图: NonfairSync继承关系: Node结点:作为获取锁失败线程的包...
  • lsgqjh
  • lsgqjh
  • 2017-03-19 15:29:40
  • 2432

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

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

公平锁与非公平锁

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

java之ReentrantLock公平锁和非公平锁

大多数情况下,大家可能都会选择使用synchronized来加锁,ReentrantLock确实是一种高级加锁工具,在确实需要一些 synchronized 所没有的特性的时候,比如时间锁等候、可中断...
  • qq_22929803
  • qq_22929803
  • 2016-05-19 23:31:50
  • 4929

4.1.9ReentrantLock的公平锁与非公平锁

公平锁:表示线程获得锁的顺序是按照线程的启动顺序的分配的,即先来先得(FIFO)。 非公平锁:表示获取锁是随机的,先启动的线程不一定先获得锁。 先看公平锁的栗子: package demo; im...
  • mrsyf
  • mrsyf
  • 2017-10-18 23:13:52
  • 111

ReentrantLock(三):公平锁与非公平锁

本篇主要承接上篇文章,简单介绍ReentrantLock的部分API应用和公平锁与非公平锁的区别。 在ReentrantLock中很明显可以看到其中同步包括两种,分别是公平的FairSync和非公平的...
  • zhang199416
  • zhang199416
  • 2017-04-26 11:52:43
  • 537

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

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

Lock和synchronized比较详解

今天看了并发实践这本书的ReentantLock这章,感觉对ReentantLock还是不够熟悉,有许多疑问,所有在网上找了很多文章看了一下,总体说的不够详细,重点和焦点问题没有谈到,但这篇文章相当不...
  • pifengyz
  • pifengyz
  • 2017-02-05 19:54:14
  • 982

公平锁和非公平锁

转载于《Java多线程核心技术》 定义: 公平锁:按照线程加锁的顺序来分配,即先来先得FIFO; 非公平锁:一种获取锁的抢占机制,是随机的获得锁的,这样可能会有些线程一直会拿不到锁,结果也就是不...
  • ycd500756
  • ycd500756
  • 2018-01-11 10:53:14
  • 52
    个人资料
    持之以恒
    等级:
    访问量: 186万+
    积分: 2万+
    排名: 509
    文章分类
    最新评论