ReentrantLock学习】的更多相关文章

对于并发工作,你需要某种方式来防止两个任务访问相同的资源,至少在关键阶段不能出现这种冲突情况.防止这种冲突的方法就是当资源被一个任务使用时,在其上加锁.在前面的文章--synchronized学习中,我们学习了Java中内建的同步机制synchronized的基本用法,在本文中,我们来学习Java中另一种锁ReentrantLock. ReentrantLock介绍 ReentrantLock,通常译为再入锁,是Java 5中新加入的锁实现,它与synchronized基本语义相同.再入锁通过代…
简介 java多线程中可以使用synchronized关键字来实现线程间同步互斥,但在jdk1.5中新增加了ReentrantLock类也能实现同样的效果,并且在扩展功能上也更加强大,比如具有嗅探锁定.多路通知分支等功能,并且使用上比synchronized更加灵活. 如何使用ReentrantLock 主要是lock.lock()和lock.unlock()两个方法 public class MyService implements Runnable { protected Reentrant…
有篇写的很不错的博客:https://blog.csdn.net/aesop_wubo/article/details/7555956    基于JDK1.8 参考着看源码 ,弄清楚lock()和unlock() 的过程. 再次基础上做下总结: 公平和非公平锁:代码层面的设计区别是,lock() 的时候,非公平锁会首先判断当前锁的状态,如果为0,则将自己设置成独占锁,不加入CLH队列 final void lock() { if (compareAndSetState(0, 1)) setExc…
Java接口Lock有三个实现类:ReentrantLock.ReentrantReadWriteLock.ReadLock和ReentrantReadWriteLock.WriteLock.Lock接口提供了比使用synchronized更广泛的锁操作. ReentrantLock是一个可重入的互斥锁.重入的含义是:当某个线程请求一个由其他线程持有的锁时,发出请求的线程就会被阻塞.但是如果某个线程试图获得一个已经由它自己持有的锁时,这个请求是会成功的."重入"意味着获取锁的操作的粒度…
参考:https://www.jianshu.com/p/4358b1466ec9 前言: 先来想象一个场景:手把手的进行锁获取和释放,先获得锁A,然后再获取锁B,当获取锁B后释放锁A同时获取锁C,当锁C获取后,再释放锁B同时获取锁D,以此类推,这种场景下,synchronized关键字就不那么容易实现了,而使用Lock却显得容易许多. 源码: public class ReentrantLock implements Lock, java.io.Serializable { private f…
本文内容主要总结自<Java并发编程的艺术>第5章——Java中的锁. 一.AQS AbstractQueuedSynchronizer(简称AQS),队列同步器,是用来构建锁或者其他同步组建的基础框架.该类主要包括: 1.模式,分为共享和独占. 2.volatile int state,用来表示锁的状态. 3.FIFO双向队列,用来维护等待获取锁的线程. AQS部分代码及说明如下: public abstract class AbstractQueuedSynchronizer extend…
本文内容主要总结自<Java并发编程的艺术>第5章——Java中的锁. 一.AQS AbstractQueuedSynchronizer(简称AQS),队列同步器,是用来构建锁或者其他同步组建的基础框架.该类主要包括: 1.模式,分为共享和独占. 2.volatile int state,用来表示锁的状态. 3.FIFO双向队列,用来维护等待获取锁的线程. AQS部分代码及说明如下: public abstract class AbstractQueuedSynchronizer extend…
1. 解决共享资源冲突 对于并发工作,需要某种方式来防止两个任务同时访问相同的资源,至少在关键阶段不能出现这种冲突情况. 方法之一就是当资源被一个任务使用时,在其上加锁.第一个访问某项资源的任务必须锁定这项资源,使其他任务在其被解锁之前,就无法访问它了,而在其被解锁之时,另一个任务就可以锁定并使用它,以此类推.Java中的synchronized.ReentrantLock就属于这种方式,关于这部分,前面有专门撰文详述: synchronized学习.synchronized底层实现学习 Ree…
AbstractQueuedSynchronizer(AQS) AQS是并发容器里的同步器,从jdk1.5开始引入了并发包,java.util.concurrent,提供了一个基于first in first out的队列,可以用于构建锁和其它同步机制的基础框架. 下面看下AQS这个类的底层结构,底层使用了双向链表,也可以把它看成是一个队列,其中sync queue就是同步队列,它是双向链表,包括head节点和tail节点,head节点主要用于后续的调度.还有一个condition queue,…
上文我们学习了ReentrantLock的基本用法,在最后我们留下了一个问题,ReentrantLock获取的锁是什么锁呢?本文我们就从源码的角度来一探究竟.本文涉及到的源码对应JDK版本为1.8. 上文说到,ReentrantLock常用的获取锁方式为: ReentrantLock lock = new ReentrantLock(); lock.lock(); try { // do something } finally { lock.unlock(); } 好,我们就从这个地方开始,首先…
转载自https://blog.csdn.net/yanyan19880509/article/details/52345422,(做了一些补充) 前言 相信学过java的人都知道 synchronized 这个关键词,也知道它用于控制多线程对并发资源的安全访问,兴许,你还用过Lock相关的功能,但你可能从来没有想过java中的锁底层的机制是怎么实现的.如果真是这样,而且你有兴趣了解,今天我将带领你轻松的学习下java中非常重要,也非常基础的可重入锁-ReentrantLock的实现机制. 以下…
前言 相信学过java的人都知道 synchronized 这个关键词,也知道它用于控制多线程对并发资源的安全访问,兴许,你还用过Lock相关的功能,但你可能从来没有想过java中的锁底层的机制是怎么实现的.如果真是这样,而且你有兴趣了解,今天我将带领你轻松的学习下java中非常重要,也非常基础的可重入锁-ReentrantLock的实现机制. 听故事把知识掌握了 在一个村子里面,有一口井水,水质非常的好,村民们都想打井里的水.这井只有一口,村里的人那么多,所以得出个打水的规则才行.村长绞尽脑汁…
ReentrantLock 相关学习笔记 标签(空格分隔): Java多线程 Java接口Lock有三个实现类:ReentrantLock.ReentrantReadWriteLock.ReadLock和ReentrantReadWriteLock.WriteLock.Lock接口提供了比使用synchronized更广泛的锁操作. ReentrantLock是一个可重入的互斥锁.重入的含义是:当某个线程请求一个由其他线程持有的锁时,发出请求的线程就会被阻塞.但是如果某个线程试图获得一个已经由它…
目录 基本用法介绍 继承体系 构造方法 state状态表示 获取锁 void lock()方法 NonfairSync FairSync 公平与非公平策略的差异 void lockInterruptibly() boolean tryLock()方法 boolean tryLock(long timeout, TimeUnit unit) 释放锁 void unlock()方法 Condition实现生产者消费者 总结 参考阅读 系列传送门: Java并发包源码学习系列:AbstractQueu…
与上一章学习的线程锁synchronized类似,都是为了解决线程安全的问题. 使用方法: 新建一个ReentrantLock对象.(如果使用Thread多线程,则需要声明static静态) 然后在需要加锁的代码块前面加如语句: lock.lock();//加锁 然后加上try catch语句.原因是如果加锁的语句出现异常,就会导致后面的解锁语句无法执行! 在finally中写解锁的语句: lock.unlock(); 全部代码如下: import java.util.concurrent.lo…
转载:https://my.oschina.net/andylucc/blog/651982 摘要 提到JAVA加锁,我们通常会想到synchronized关键字或者是Java Concurrent Util(后面简称JCU)包下面的Lock,今天就来扒一扒Lock是如何实现的,比如我们可以先提出一些问题:当我们通实例化一个ReentrantLock并且调用它的lock或unlock的时候,这其中发生了什么?如果多个线程同时对同一个锁实例进行lock或unlcok操作,这其中又发生了什么? 什么…
这个锁叫可重入锁.它其实语义上和synchronized差不多,但是添加了一些拓展的特性. A reentrant mutual exclusion Lock with the same basic behavior and semantics as the implicit monitor lock accessed using synchronized methods and statements, but with extended capabilities. 我们重点看看它的源代码实现.…
ReentrantLock是一个可重入的互斥锁,ReentrantLock由最近成功获取锁,还没有释放的线程所拥有,当锁被另一个线程拥有时,调用lock的线程可以成功获取锁.如果锁已经被当前线程拥有,当前线程会立即返回.此类的构造方法提供一个可选的公平参数 public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); } 公平与非公平有何区别,所谓公平就是严格按照FIFO顺序获取锁,非…
ReentrankLock  分为 非公平锁及公平锁 首先我们看一下它里面有哪些属性: private final Sync sync;Sync 这个类是 ReentrantLock的 一个静态内部类,实现了AbstractQueuedSynchronizer ReentrantLock根据传入构造方法的布尔型参数实例化出Sync的实现类FairSync和NonfairSync,分别表示公平的Sync和非公平的SyncAbstractQueuedSynchronizer这个类中封装了同步过程中堵…
锁的概念 从jdk发行1.5版本之后,在原来synchronize的基础上,增加了重入锁ReentrantLock. 本文就不介绍synchronize了,有兴趣的同学可以去了解一下,本文重点介绍ReentrantLock和ReentrantReadWriteLock. 锁是什么? 并发编程的时候,比如说有一个业务是读写操作,那多个线程执行这个业务就会造成已经写入的数据又写一遍,就会造成数据错乱. 所以需要引入锁,进行数据同步,强制使得该业务执行的时候只有一个线程在执行,从而保证不会插入多条重复…
说明 ReentrantLock是java官方的一个线程锁类,ReentarntLock实现了Lock的接口 我们只需要使用这个,就可以不用使用synchronized同步关键字以及对应的notifyall方法和wait方法去写我们的生产者消费者模式. 这样就可以大大简化我们的代码 代码 Producer.java package producterandcustomer; import java.util.List; import java.util.concurrent.locks.Lock…
1. 使用ReentrantLock import java.util.concurrent.locks.ReentrantLock; public class TestReentrantLock { public static void main(String[] args) { final ReentrantLock reentrantLock = new ReentrantLock(true); reentrantLock.lock(); new Thread("Thread 1"…
一.可重入性的理解 从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大.两者都是同一个线程每进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁. 比如下面的代码片段:第一个lock没有unlock,就再次获取了lock private Lock lock = new ReentrantLock(); lock.lock(); 执行一段代码 lock.lock(); 再行执行一段代码…
目录 简介 AQS同步状态 AQS同步队列 ReentrantLock数据结构 公平锁的获取 tryAcquire(arg) addWaiter(Node mode) acquireQueued(final Node node, int arg) 锁的释放 tryRelease(int releases) unparkSuccessor(Node node) 非公平锁的获取 nonfairTryAcquire(int acquires) 总结 简介   ReentrantLock是基于同步器Ab…
概述 ReentrantLock,即重入锁,是一个和synchronized关键字等价的,支持线程重入的互斥锁.只是在synchronized已有功能基础上添加了一些扩展功能. 除了支持可中断获取锁.超时获取锁.非阻塞获取锁这些显示锁的常见功能外,ReentrantLock还支持公平锁(synchronized只支持非公平锁). 下面分析源码时将聚焦重入和公平这两个功能点的实现. 结构总览 重入锁的大体结构如下: public class ReentrantLock implements Loc…
重入锁  :(ReentrantLock) 上锁 用reentrantLock.lock 方法 解锁 用reentrantLock.unlock 方法 上锁和解锁 必须配对 可以多重上锁 ReentrantLock 是对 synchronized 的升级,synchronized 底层是通过 JVM 实现的, ReentrantLock 是通过 JDK 实现的,使⽤起来更加简单. 重⼊锁是指可以给同⼀个资源添加过个锁,并且解锁的⽅式与 synchronized 有区别, synchronized…
[^ ]: 以下源码分析基于JDK1.8 ReentrantLock 示例 private ReentrantLock lock = new ReentrantLock(true); public void f(){ try { lock.lock(); //do something } finally { lock.unlock(); } } 源码解析(公平锁-lock流程) 构造方法 //默认是非公平锁 public ReentrantLock() { sync = new NonfairS…
[^]: 以下源码分析基于JDK1.8 ReentrantLock 示例 private ReentrantLock lock = new ReentrantLock(true); public void f(){ try { lock.lock(); //do something } finally { lock.unlock(); } } 源码解析(公平锁-unlock流程) ReentrantLock#unlock() public void unlock() { sync.release…
重入锁(ReentrantLock)是一种递归无阻塞的同步机制.以前一直认为它是synchronized的简单替代,而且实现机制也不相差太远.不过最近实践过程中发现它们之间还是有着天壤之别. 以下是官方说明:一个可重入的互斥锁定 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁定相同的一些基本行为和语义,但功能更强大.ReentrantLock 将由最近成功获得锁定,并且还没有释放该锁定的线程所拥有.当锁定没有被另一个线程所拥有时,调用 lock 的线程将成功获取…
笔记主要参考<Java并发编程的艺术>并且基于JDK1.8的源码进行的刨析,此篇只分析独占模式,后续在ReentrantReadWriteLock和 CountDownLatch中 会重点分析AQS的共享模式 一丶Lock 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁可以防止多个线程同时访问共享资源(这种锁称为独占锁,排他锁)但是有些锁可以允许多个线程并发访问共享资源,比如读写锁 1.Lock接口的方法: 方法 作用 void lock() 获取锁,调用该方法的线程将会获取锁,当锁…