一. 概述 本文首先介绍Lock接口.ReentrantLock的类层次结构以及锁功能模板类AbstractQueuedSynchronizer的简单原理,然后通过分析ReentrantLock的lock方法和unlock方法,来解释ReentrantLock的内部原理,最后做一个总结.本文不涉及ReentrantLock中的条件变量. Lock接口,是对控制并发的工具的抽象.它比使用synchronized关键词更灵活,并且能够支持条件变量.它是一种控制并发的工具,一般来说,它控制对某种共享资…
本文紧接上文的AQS源码,如果对于ReentrantLock没有基础可以先阅读我的上一篇文章学习ReentrantLock的源码 ReentrantLock锁重入原理 重入加锁其实就是将AQS的state进行加一操作 然后释放锁资源将AQS的state进行减一操作 当state为0时才会彻底的释放锁资源 ReentrantLock可打断原理 在ReentrantLock中可打断就是在等待锁的过程中可以被interrupt打断(需要调用lockInterruptibly),lock方法设置了打断标…
ReenTrantLock可重入锁(和synchronized的区别)总结 可重入性: 从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大.两者都是同一个线程没进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁. 锁的实现: Synchronized是依赖于JVM实现的,而ReenTrantLock是JDK实现的,有什么区别,说白了就类似于操作系统来控制实现和用户自己敲代码实现的区…
ReenTrantLock可重入锁和synchronized的区别 可重入性: 从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大.两者都是同一个线程没进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁. 锁的实现: Synchronized是依赖于JVM实现的,而ReenTrantLock是JDK实现的,有什么区别,说白了就类似于操作系统来控制实现和用户自己敲代码实现的区别.前者…
java.util.concurrent.locks ReentrantLock即可重入锁,实现了Lock和Serializable接口 ReentrantLock和synchronized都是可重入锁. 基本原理 ReentrantLock的基本原理: 底层依赖AbstractQueuedSynchronizer. 先通过CAS尝试获取锁. 如果此时已经有线程占据了锁,那就加入CLH队列并且被挂起. 当锁被释放之后,排在CLH队列队首的线程会被唤醒,然后CAS再次尝试获取锁. 非公平锁: 如果…
import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantLock; /** * @author admin * @date 2018/1/16 12:16 * ReentrantLock 可重入锁: * 1.启动两个线程,线程A获取锁,然后执行:同时线程B进来后,一直阻塞,直到线程A释放锁之后,线程B才接着执行 */ public class ReentrantLockTest { Reen…
目录 一.ReentrantLock可重入锁 二.ReentrantReadWriteLock读写锁 三.读锁之间不互斥 欢迎关注我的博客,更多精品知识合集 一.ReentrantLock可重入锁 可重入锁ReentrantLock 是一个互斥锁,即同一时间只有一个线程能够获取锁定资源,执行锁定范围内的代码.这一点与synchronized 关键字十分相似.其基本用法代码如下: Lock lock = new ReentrantLock(); //实例化锁 //lock.lock(); //上锁…
ReentrantLock是lock接口的一个实现类,里面实现了可重入锁和公平锁非公平锁 ReentrantLock公平锁和不公平锁实现原理 公平锁会获取锁时会判断阻塞队列里是否有线程再等待,若有获取锁就会失败,并且会加入阻塞队列 非公平锁获取锁时不会判断阻塞队列是否有线程再等待,所以对于已经在等待的线程来说是不公平的,但如果是因为其它原因没有竞争到锁,它也会加入阻塞队列 进入阻塞队列的线程,竞争锁时都是公平的,应为队列为先进先出(FIFO) 默认实现的是非公平锁 public Reentran…
目录 基本用法介绍 继承体系 构造方法 state状态表示 获取锁 void lock()方法 NonfairSync FairSync 公平与非公平策略的差异 void lockInterruptibly() boolean tryLock()方法 boolean tryLock(long timeout, TimeUnit unit) 释放锁 void unlock()方法 Condition实现生产者消费者 总结 参考阅读 系列传送门: Java并发包源码学习系列:AbstractQueu…
1.可重入锁是可以中断的,如果发生了死锁,可以中断程序 //如下程序出现死锁,不去kill jvm无法解决死锁 public class Uninterruptible { public static void main(String[] args) throws InterruptedException { final Object o1 = new Object(); final Object o2 = new Object(); Thread t1 = new Thread() { pub…