ReentrantLock(true)为什么公平锁仍然会出现一个线程连续获得锁的情况?

ReentrantLock(true)为什么公平锁仍然会出现一个线程连续获得锁的情况?

 public class LockFairTest implements Runnable{
    //创建公平锁
    private static ReentrantLock lock=new ReentrantLock(true);
    public void run() {
        while(true){
            lock.lock();
            try{
                System.out.println(Thread.currentThread().getName()+"获得锁");
            }finally{
                lock.unlock();
            }
        }
    }
    public static void main(String[] args) {
        LockFairTest lft=new LockFairTest();
        Thread th1=new Thread(lft);
        Thread th2=new Thread(lft);
        th1.start();
        th2.start();
    }
}

Thread-1获得锁
Thread-1获得锁
Thread-1获得锁
Thread-1获得锁
Thread-1获得锁
Thread-1获得锁
Thread-1获得锁
Thread-1获得锁
Thread-1获得锁
Thread-0获得锁
Thread-1获得锁
Thread-0获得锁

1个回答

线程调用start()之后并不是立刻开始执行run方法。他需要等待其他系统资源准备就绪。例如:CPU。
Thread0最开始可能没有获取到CPU时间,Thread1却获取到且跑了几次。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
ReentrantLock 公平锁和非公平锁
对于ReentrantLock,一般我们在调用无参构造函数的时候,构造的是非公平锁,当前类也存在一种可以指定锁类型的构造方法,即 ReentrantLock(boolean fair),ReentrantLock锁的实现是通过内部类FairSync和NonfairSync继承AQS实现的。 我们今天主要讨论下这两个内部类,从而探讨下代码级别是如何实现公平锁和非公平锁的。 先看Reentra...
ReentrantLock公平锁和非公平锁
公平锁是指多个线程在等待同一个锁时,必须按照申请锁的先后顺序来一次获得锁。 公平锁的好处是等待锁的线程不会饿死,但是整体效率相对低一些;非公平锁的好处是整体效率相对高一些,但是有些线程可能会饿死或者说很早就在等待锁,但要等很久才会获得锁。其中的原因是公平锁是严格按照请求所的顺序来排队获得锁的,而非公平锁时可以抢占的,即如果在某个时刻有线程需要获取锁,而这个时候刚好锁可用,那么这个线程会直接抢占,...
ReentrantLock的公平锁和非公平锁
今天学习了一下关于Lock中的公平锁和非公平锁,就想总结一下这两种之间的区别。具体有不对的地方欢迎指正。     首先锁Lock分为"公平锁"和"非公平锁",公平锁表示线程获取锁的顺序是按照线程加锁的顺序来分配的,即呢就是先来先得的FIFO先进先顺序。非公平锁就是获取锁的抢占机制,是随机获取锁的,那这俩货的区别就在这个地方了,非公平锁先来的不一定先得到锁,这就会造成某些线程可能一直拿不到锁,结果
ReentrantLock的非公平锁和公平锁的实现原理
非公平锁 因为之前已经分析过AQS,ReentranLock是利用一个实现了AQS的NonfairSync来获取非公平锁。所以只需关注NonfairSync的tryAcquire的实现。       获取锁(nonfairTryAcquire方法定义在Sync内部类中)   获取锁成功分为两种情况,第一个if判断AQS的state是否等于0,表示锁没有人占有。接着,hasQueu...
ReentrantLock(三):公平锁与非公平锁
本篇主要承接上篇文章,简单介绍ReentrantLock的部分API应用和公平锁与非公平锁的区别。 在ReentrantLock中很明显可以看到其中同步包括两种,分别是公平的FairSync和非公平的NonfairSync。 可以看看ReentrantLock的源码构造方法 public ReentrantLock() { sync = new NonfairSync
java之ReentrantLock公平锁和非公平锁
大多数情况下,大家可能都会选择使用synchronized来加锁,ReentrantLock确实是一种高级加锁工具,在确实需要一些 synchronized 所没有的特性的时候,比如时间锁等候、可中断锁等候、无块结构锁、多个条件变量或者锁投票。 以下实现公平锁和非公平锁,公平锁在性能上会多消耗点 package com.cmcc.web.test.lock; import java.util
ReentrantLock源码之公平锁与非公平锁
ReentrantLock类与Synchronized关键字的主要区别之一就是可以实现公平锁和非公平锁。我们看下ReentrantLock类是如果实现公平锁与非公平锁的。 1、非公平锁的实现 ReentrantLock默认构造函数为非公平锁(为什么?因为非公平锁的实现可以减少线程的切换,提高执行效率。) public ReentrantLock() { sync = new...
ReentrantLock与公平锁、非公平锁实现
前言最近开始读JDK源码,所有心得准备总结成一个专栏,JDK Analysis系列的第一篇,就从万众瞩目的ReentrantLock开始吧,而谈到ReentrantLock,就不得不说AQS,它是AbstractQueuedSynchronizer类的简称,Doug Lea上神在JDK1.5将其引入,这才有了现在的并发包java.util.concurrent,所以要理解ReentrantLock的
公平性锁和非公平锁:ReentrantLock源码解析
在Java中为了保证代码同步时的安全问题,通常会使用线程同步机制,前面讲过了使用重量级锁Synchronized来保证线程安全,虽然Java对Synchronized做了优化,性能上已经有了大的提升,但是仍然会推荐使用Lock,也就是今天介绍的另外一种保证线程安全的方式:可重入锁 使用 可重入锁(ReentrantLock)的使用比较简单,而且非常灵活 我们只需要new一个ReentrantLoc...
独占锁ReentrantLock中的公平锁源码解析
最近几天学习Lock的实现,顺手记下笔记。废话不多说从lock()方法开始。public void lock() { sync.lock(); }sync是ReentrantLock下的一个属性字段,属于抽象类,有两个实现:FairSync(公平锁)、 NonfairSync(非公平锁)。那这篇解析的会是稍微复杂的公平锁。final void lock() { acqui...
从AbstractQueuedSynchronizer到ReentrantLock中独占锁、公平锁、非公平锁源码分析
1. 整体介绍 AbstractQueuedSynchronizer这个类可以理解为是一个同步器,ReentrantLock、ReentrantReadWriteLock都是基于它来实现锁的获取、释放,和synchronized关键字不同的是,AbstractQueuedSynchronizer直接在代码层面实现了锁机制。 2. AbstractQueuedSynchronizer分析 2....
重入锁ReentrantLock之公平锁与非公平锁
        公平锁:线程获取锁的顺序是按照线程加锁的顺序来分配的,即先进先出。        非公平锁:线程获取锁的顺序是随机的,听天由命。        怎样构建公平锁与非公平锁?        类ReentrantLock有两个构造方法,其中一个是传递一个boolean类型的参数,标识创建一个具有给定公平策略的ReentrantLock,即:1. 创建公平锁或非公平锁public clas...
ReentrantLock的公平锁与非公平锁浅析
ReentrantLock可重入锁,并且实现了公平锁,采用AQS的独占模式。一开始我以为ReentrantLock的非公平锁是这样的,当一个线程在释放锁事,会唤醒列队同步器中随便一个线程,让其获取锁。实际不是这样的,线程一旦以node的形式加入列队中就是按先进先出的方式进行唤醒,调用的。这里的公平与非公平指的是在前个线程释放锁的时候正好有个线程又要获取锁(还没加入到列队),这时候后来的线程是可以插...
ReentrantLock——公平锁与非公平锁对比
/** * 公平锁非公平锁 */ @Test public void FairLockAndNotFairLockTest() throws Exception { ReentrantLock2 fairLock = new ReentrantLock2(true); ReentrantLock2 unFairLock = ne...
ReentrantLock之公平锁,可重入的理解
一.问题ReentrantLock是jdk5里面的一个方法类,主要讨论两个问题:1.ReentrantLock的可重入体现2.ReentrantLock的公平锁和非公平锁体现二.讲解2.1ReentrantLock的可重入体现...
ReentrantLock非公平锁理解
一直理解,ReentrantLock支持公不锁与非公平锁,公平锁即先申请先得到锁,非公平锁相把,即锁释放时,所有线程同时竞争锁。今天读了ReentrantLock源码,发现自己解决的非公平锁与源码实现不同。非公平锁并不是所有线程同时竞争锁,而是新线程第一次竞争锁时,和线程步队列中的第一个线程进行竞争锁,从而达到非公平。 开始怀疑人生了,这也不是决对的非公平,于是上网查了一下,从一个博客下面,有一段...
Java中ReentrantLock的公平锁和非公平锁
了解 Java 中 ReentrantLock 的程序员都知道,ReentrantLock 的核心组成是队列同步器 AbstractQueuedSynchronizer。而ReentrantLock中定义了内部抽象类Sync,又定义了NonfairSync和FairSync,这两者分别是非公平锁和公平锁的组件。
ReentrantLock中公平锁与非公平锁的区别
ReentrantLock:通过模板模式使用Sync继承了AbstractQueuedSynchronizer(同步器) ,继而又使用了FairSync,NonFairSync类来覆写了Sync的方法, 在使用ReentrantLock时,通过构造方法确定使用公平锁还是非公平锁。 公平锁与非公平锁的差别主要在获取锁时: 公平锁: //首先直接调用acquire方法 final void lock...
深入剖析ReentrantLock公平锁与非公平锁源码实现
本文以公平与非公平锁的加锁缩成为主线,分析整个加锁过程。准备知识简介ReentrantLock类图: NonfairSync继承关系: Node结点:作为获取锁失败线程的包装类, 组合了Thread引用, 实现为FIFO双向队列。 下图为Node结点的属性描述 锁的创建非公平锁(默认)final ReentrantLock lock = new ReentrantL
ReentrantLock源码分析(公平锁)
ReentranLock通过lock来获取锁,下面就通过lock来分析公平锁的过程1、lock()方法 final void lock() { acquire(1); }lock()方法通过acquire()方法来获取锁,acquire()方法中的参数是用来设置锁的状态。对于独占锁而言,可被获取的状态为0,如果是初次获取,状态就被设置成1,而Reentran...
reentrantLock公平锁和非公平锁源码解析
ReentrantLock非公平锁源码分析 ReentrantLock lock = new ReentrantLock(); lock.lock(); 上面这段代码是最简单的获取ReentrantLock的非公平锁的代码,我们来看看这段代码后面的源码是如何运行的。 final void lock() { //首先尝试看看能不能获取到锁,如果CAS成功,那么就获取到了 if (compa...
12、ReentrantLock中的公平锁和非公平锁的原理
ReentrantLock ReentrantLock内部是通过AQS实现锁的功能,有公平锁和非公平锁两种实现。 公平锁,即锁的获取顺序按线程申请锁的先后顺序。 非公平锁,当一个线程t1申请锁时,锁刚好释放。即使已有其他线程在t1之前申请锁排队,线程t1还是会获取锁。这样减少了线程的等待唤醒的可能,减少上下文切换带来的开销。因为获取锁的顺序和申请顺序可能不一致所以叫非公平锁。 前置技能(先了...
多线程(3)——ReentrantLock的公平锁与非公平锁
什么是公平锁和非公平锁 公平锁(Fair):加锁前检查是否有排队等待的线程,优先排队等待的线程,先来先得 非公平锁(Nonfair):加锁时不考虑排队等待问题,直接尝试获取锁,获取不到自动到队尾等待 怎样设置公平锁和非公平锁 先看一下源码 //定义成final型的成员变量,在构造方法中进行初始化 private final Sync sync; //无参数默认非公平锁 pub...
ReentrantLock中公平锁与非公平锁的效率对比
程序逻辑如下:开20个线程,共享一个static的int变量race,每个线程所做的事情只有一个:将race自增十万次。同时,使用参数-XX:+PrintGCDetails显示JVM的GC情况 具体代码如下:
深入分析ReentrantLock公平锁和非公平锁的区别
在ReentrantLock中包含了公平锁和非公平锁两种锁,通过查看源码可以看到这两种锁都是继承自Sync,而Sync又继承自AbstractQueuedSynchronizer,而AbstractQueuedSynchronizer又继承自AbstractOwnableSynchronizer,下面是类的继承关系图: 其中AbstractOwnableSynchronizer是提供了设置占...
多线程-ReentrantLock源码分析(公平锁和非公平锁)
什么是公平性锁: 按照线程请求锁的顺序来获取锁。 什么是非公平性锁: 获取锁的线程不是按照先来后到的顺序获取,而是抢夺式获取锁。 ReentrantLock源码分析: 继承关系: ReentrantLock实现了Lock接口。该接口提供了一些通用的加锁解锁操作。 void lock(): 加锁操作,得不到则阻塞直至得到锁。 void lockInterruptibly() throws Int...
Java并发——ReentrantLock的公平锁与非公平锁
一、锁的公平性含义所谓公平锁,就是在绝对时间上,先对锁发起获取请求的一定先被满足,那么这个锁是公平的,反之,则是非公平的。因为ReentrantLock的实现是通过自定义的静态内部类sync实现的,sync继承了AbstractQueuedSynchronizor抽象类,因此ReentrantLock也是实现了基于双向链表的同步队列,也就是说,如果每次都是选择队列头的Node关联的线程获取锁,那就...
线程学习之锁,ReentrantLock,Synchronize
一.ReentrantLock特点: 1.1 是独占锁并且是可重入的: 独占互斥的,需要手动释放锁; 可重入的,但是要释放相同次数的锁; 1.2 默认是非公平锁,也可以实现公平锁: 非公平锁:当前线程直接尝试获取锁,不管自己是不是身处队尾; 公平锁:按照队列顺序来,前面还有就等待; 创建的时候,加上参数true是公平锁,公平锁能够避免线程饥饿 1.3 可以获取锁时限等待:...
多线程之 ReentrantLock 的公平锁与非公平锁
ReentrantLock 重入锁的意思。重入的意思是任意线程再获取到锁后能够再次获取该锁而不会被锁阻塞。ReentrantLock 包含公平锁和非公平锁。ReetrantLock 的构造函数中根据boolean值的不同  FairSync 公平同步器与非公平同步器上图中的公平同步器中获取锁时有个 hasQueuedPredecessors() 方法,这是唯一 一处与非公平同步器的地方,判断当前当...
公平锁,非公平锁,乐观锁,悲观锁、ReenTrantLock、synchronized
参考: 面试必备之乐观锁与悲观锁 公平锁,非公平锁,乐观锁,悲观锁 ReenTrantLock可重入锁(和synchronized的区别)总结 悲观锁: 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。 传统的关系型数据库里边就用到了很多这种...
锁- 公平锁和非公平锁的差异
 java http http
ReentrantLock公平与非公平锁原理
就这么一点点点改变
ReentrantLock源码解析( 释放公平锁)
1、unlock()  public void unlock() {         sync.release(1);     }unlock()调用的release()方法,方法中参数传入1。跟获取锁一样,每调用一次unlock(),锁的状态减1,当锁的状态等于0时,将会唤醒队列中的下一个节点。2、release() public final boolean release(int arg) {...
java ReentrantLock(显示锁-公平锁)实现原理深入探究
ReentrantLock reentrantLock=new ReentrantLock(true); reentrantLock.lock(); reentrantLock.unlock(); 1 reentrantLock.lock() 内部实现 final void lock() { acquire(1); } 2 acquire(1) 内部实现: public fi...
独占锁ReentrantLock中的非公平锁源码解析
继上一篇对公平锁的解析,这次来看下非公平锁又是怎么做的。同样的,使用时都会调用到lock方法。public void lock() { sync.lock(); }然后经由Sync的子类实现,调用到NonfairSync的lock方法。其中lock方法主要做的就是线程一进来就尝试用过CAS获取锁,如果成功则直接设置当前线程为获取到锁的线程,否则进入acquire方法。(注:公平锁再CAS获...
线程公平锁和非公平锁使用
-
mysql锁的出现情况
select * from information_schema.INNODB_LOCK_WAITS; 一、表结构 其中name是唯一索引。 二、准备用到的命令 select * from information_schema.INNODB_TRX; //记录当前正在执行的事务,以及事务的一些状态 select * from information_schema.INNODB_L...
多线程-内置锁、显式锁、公平锁、非公平锁
synchronized :代码简洁,隐式支持可重新获得锁 synchronized就不实现了,大家可以自行尝试 Lock:获取锁可以被中断,超时获取锁,尝试获取锁 Lock锁的运用更加灵活 这里我们用可重入锁的实例来实现:Lock lock = new ReentrantLock();(注意,这里我们可以观察ReentrantLock里面) 这一段话意味着,我们在构造锁实例的时候...
java并发线程---对锁ReentrantLock的理解
前几篇的博文我们谈论过了java多线程的一些概念,java的内存模型,synchronize关键字的使用等,今天我们再来谈谈ReentrantLock锁的使用。 关于锁机制,后面我会花很大的篇幅来详细讲解的,现在先看看怎么去使用最简单的Lock,我觉得只有使用好,或者说能熟练的使用然后再去深入的理解往往会事半功倍。   废话不多说,我们就直接进入到正题吧。 1.之前我们说过,为了保证线程安全
为什么出现数据库被锁的情况。
还是那个问题。删除的时候显示数据库被锁。
相关热词 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池 c#5.0 安装程序 c# 分页算法