最近正在阅读Java ReentrantLock源码,始终对可重入和不可重入概念理解不透彻,进行学习后记录在这里。...基础知识 Java多线程的wait()方法和notify()方法 这两个方法是成对出现和使用的,要执行这两个方法,有一个前提就是,当前线程必须获其对象的monitor(俗称“锁”),否则会抛出IllegalMonitorStateException...wait():阻塞当前线程 notify():唤起被wait()阻塞的线程 不可重入锁 所谓不可重入锁,即若当前线程执行某个方法已经获取了该锁,那么在方法中尝试再次获取锁时,就会获取不到被阻塞。...这个例子很好的说明了不可重入锁。 可重入锁 接下来,我们设计一种可重入锁 ? 所谓可重入,意味着线程可以进入它已经拥有的锁的同步代码块儿。...可重入锁的概念和设计思想大体如此,Java中的可重入锁ReentrantLock设计思路也是这样
synchronized 和 ReentrantLock 都是可重入锁。 可重入锁的意义在于防止死锁。 实现原理是通过为每个锁关联一个请求计数器和一个占有它的线程。...直到计数器为0,锁被释放。 关于父类和子类的锁的重入:子类覆写了父类的synchonized方法,然后调用父类中的方法,此时如果没有重入的锁,那么这段代码将产生死锁(很好理解吧)。...A类对象的锁,而其他线程是不可以的,这就是可重入锁。...可重入锁的概念和设计思想大体如此,Java中的可重入锁ReentrantLock设计思路也是这样。 synchronized和ReentrantLock 都是可重入锁。...摘自:JAVA可重入锁与不可重入锁 和 Java不可重入锁和可重入锁理解 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/153277.html原文链接:https
简介 ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。...在java关键字synchronized隐式支持重入性。synchronized通过获取自增,释放自减的方式实现重入。与此同时,ReentrantLock还支持公平锁和非公平锁两种方式。...重入性 重入性关键点在于以下两个方面: 1、在线程获取锁的时候,如果已经获取锁的线程是当前线程的话则直接再次获取成功; 2、由于锁会被获取n次,那么只有锁在被释放同样的n次之后,该锁才算是完全释放成功。...公平锁和非公平锁 ReentrantLock支持两种锁:公平锁和非公平锁。何谓公平性,是针对获取锁而言的,如果一个锁是公平的,那么锁的获取顺序就应该符合请求上的绝对时间顺序,满足FIFO。..., java.io.Serializable 说明:ReentrantLock实现了Lock接口,Lock接口中定义了lock与unlock相关操作,并且还存在newCondition方法,表示生成一个条件
大家好,又见面了,我是你们的朋友全栈君。 最近正在阅读Java ReentrantLock源码,始终对可重入和不可重入概念理解不透彻,进行学习后记录在这里。...基础知识 Java多线程的wait()方法和notify()方法 这两个方法是成对出现和使用的,要执行这两个方法,有一个前提就是,当前线程必须获其对象的monitor(俗称“锁”),否则会抛出IllegalMonitorStateException...wait():阻塞当前线程 notify():唤起被wait()阻塞的线程 不可重入锁 所谓不可重入锁,即若当前线程执行某个方法已经获取了该锁,那么在方法中尝试再次获取锁时,就会获取不到被阻塞。...这个例子很好的说明了不可重入锁。...可重入锁的概念和设计思想大体如此,Java中的可重入锁ReentrantLock设计思路也是这样 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/153238.html
什么是可重入锁,什么是不可重入锁,它们是如何实现的?...基于 wait/notify 实现不可重入锁 import java.util.concurrent.locks.ReentrantLock; /** * 不可重入锁 */ public class...基于自旋锁实现可重入锁 直接用上个例子的代码改一下: import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.locks.ReentrantLock.../代码块的synchronized关键字提供的也是一个可重入锁。...ReentrantLock ReentrantLock是Java中很常见的工具类, 从名字就可以看出,它是个可重入锁,用法也很简单: import java.util.concurrent.locks.ReentrantLock
CAS主要通过compareAndSwapXXX()方法来实现,而这个方法的实现需要涉及底层的unsafe类 unsafe类:java不能直接访问操作系统底层,而是通过本地方法来访问。...这时就无法再调用doAdd()方法,这时必须先释放锁才能调用,所以称这种锁为不可重入锁,也叫自旋锁。...第一个线程执行print()方法,得到了锁,使lockedBy等于当前线程,也就是说,执行的这个方法的线程获得了这个锁,执行add()方法时,同样要先获得锁,因不满足while循环的条件,也就是不等待,...只有当第一个线程释放了所有的锁,执行了notify()方法,第二个线程才得以跳出循环,继续执行。 这就是可重入锁的特点。...java中常用的可重入锁 synchronized java.util.concurrent.locks.ReentrantLock AtomicIntegerFieldUpdater:原子更新整型的字段的更新器
所谓重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的。 synchronized 和 ReentrantLock 都是可重入锁。...可重入锁的意义在于防止死锁。 可重入锁简单演示 什么是 “可重入”,可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁。...关于父类和子类的锁的重入:子类覆写了父类的synchonized方法,然后调用父类中的方法,此时如果没有重入的锁,那么这段代码将产生死锁(很好理解吧)。...A类对象的锁,而其他线程是不可以的,这就是可重入锁。...可重入锁的概念和设计思想大体如此,Java中的可重入锁ReentrantLock设计思路也是这样。 synchronized和ReentrantLock 都是可重入锁。
锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) 。...这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及。本系列文章将分析JAVA下常见的锁名称以及特性,为大家答疑解惑。...四、可重入锁: 本文里面讲的是广义上的可重入锁,而不是单指JAVA下的ReentrantLock。...可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。...在JAVA环境下 ReentrantLock 和synchronized 都是 可重入锁 下面是使用实例: ? ? 两个例子最后的结果都是正确的,即 同一个线程id被连续输出两次。
还没有优化synchronize之前还有一个锁比它表现的更为亮眼,这个锁就是重入锁。...再来看这个锁为什么叫做重入锁呢,这是因为这种锁是可以反复进入的,比如说如下操作是允许的。...在之前的文章:多线程基本概念 中有提到过因为线程优先级而导致的饥饿问题,重入锁提供了一种公平锁的功能,可以忽略线程的优先级,让所有线程公平竞争。...使用公平锁的方式只需要在重入锁的构造方法传入一个true就可以了。...,如果我们使用synchronize或者重入锁的时候我想上方最后的耗时应该是26秒多。
不可重入锁示例(同一个线程不可以重入上锁后的代码段) 如下是一个不可重入锁的逻辑过程,会发现执行main方法控制台会打印执行doJob方法前,然后就会一直线程阻塞,不会打印执行doJob方法过程中,原因在于第一次上锁后...这种现象就造成了不可重入锁 public class Count{ MyLock lock = new MyLock(); public static void main(String...notify(); // 接触阻塞 } } 可重入锁示例(同一个线程可以重入上锁的代码段,不同的线程则需要进行阻塞) java的可重入锁有:ReentrantLock...(显式的可重入锁)、synchronized(隐式的可重入锁) 可重入锁诞生的目的就是防止上面不可重入锁的那种情况,导致同一个线程不可重入上锁代码段。...设计可重入锁的示例代码 public class MyReentrantLock { boolean isLocked = false; // 默认没有上锁 Thread
前言 目前主流的锁有两种,一种是synchronized,另一种就是ReentrantLock,JDK优化到现在目前为止synchronized的性能已经和重入锁不分伯仲了,但是重入锁的功能和灵活性要比这个关键字多的多...,所以重入锁是可以完全替代synchronized关键字的。...下面就来介绍这个重入锁。 正文 ReentrantLock重入锁是Lock接口里最重要的实现,也是在实际开发中应用最多的一个,我这篇文章更接近实际开发的应用场景,为开发者提供直接上手应用。...第一种声明的是公平锁,所谓公平锁,就是按照时间先后顺序,使先等待的线程先得到锁,而且,公平锁不会产生饥饿锁,也就是只要排队等待,最终能等待到获取锁的机会。...第二种声明的是非公平锁,所谓非公平锁就和公平锁概念相反,线程等待的顺序并不一定是执行的顺序,也就是后来进来的线程可能先被执行。
使用线程根本上是为了更充分的利用cpu资源。 线程的状态 查看Java源码可知,线程的状态一共有6种,分别是新建、运行、阻塞、等待、超时等待、终止。...什么是重入锁 ReentrantLock是实现Lock接口的一个类,支持重入性。线程在被两次lock加锁后会被阻塞,在复杂的调用场景中为了避免这种情况,于是就有了可重入锁。...使用condition condition是重入锁的伴生对象。它提供了在重入锁的基础上,进行等待和通知的机制。...现在我们使用重入锁,实现一个简单的计数器。...对于同一个线程,重入锁允许你反复获得一把锁,但是,申请和释放锁的次数必须一致。 默认情况下,重入锁是非公平的,公平的重入锁性能差于非公平锁 重入锁的内部实现是基于CAS操作的。
重入锁ReentrantLock,支持重进入的锁,能支持一个线程对资源的重复加锁 支持获取锁时的公平和非公平的选择,默认非公平 锁的公平与否:在绝对时间上,先对锁进行获取的请求一定先被满足,则锁是公平的...重进入是指任意线程在获取到锁之后能够再次获取该锁,需要解决两个问题: 识别获取锁的线程是否为占据当前锁的线程。 线程重复n次获取锁,随后第n次释放锁后,其他线程能获取到锁。...ReentrantLock通过组合自定义同步�器实现锁的获取和释放: nonfairTryAcquire方法非公平获取 tryAcquire()方法公平获取,比nonfairTryAcquire多了hasQueuedPredecessors...公平锁和非公平锁的代码示例: import org.junit.Test; import java.util.ArrayList; import java.util.Collection; import...java.util.Collections; import java.util.List; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock
2.原理 本章将会简单介绍重入锁 ReentrantLock 中的一些概念和相关原理,包括可重入、公平和非公平锁等原理。...是 ✅ 是否可尝试加锁 否 是 ❌ 是否是Java内置特性 是 否 ❌ 自动获取/释放锁 是 否 ❌ 对异常的处理 自动释放锁 需手动释放锁 ❌ 除此之外,ReentrantLock 提供了丰富的接口用于获取锁的状态...由于 m1 和 m2 使用的是同一把可重入锁,所以线程 t 可以进入方法 m2,并再次获得锁,而不会被阻塞住。...不过好在《Java并发编程实战》在第13.3节 公平性(p232)说明了具体的原因,这里引用一下: 在激烈竞争的情况下,非公平锁的性能高于公平锁的性能的一个原因是:在恢复一个被挂起的线程与该线程真正开始运行之间存在着严重的延迟...线程 C 在抢占锁的情况下,仍未影响线程 B 获取锁,因此是个“双赢”的局面。 除了上面的原因外,《Java并发编程的艺术》在其5.3.2 公平与非公平锁的区别(p137)分析了另一个可能的原因。
两种锁定方式各有优劣,下面简单对比一下: 1、synchronized是关键字,就和if…else…一样,是语法层面的实现,因此synchronized获取锁以及释放锁都是Java虚拟机帮助用户完成的;...二、读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可。...如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁;如果你的代码修改数据,只能有一个人在写,且不能同时读取,那就上写锁。总之,读的时候上读锁,写的时候上写锁!...ReentrantReadWriteLock会使用两把锁来解决问题,一个读锁,一个写锁 线程进入读锁的前提条件: 没有其他线程的写锁, 没有写请求或者有写请求,但调用线程和持有锁的线程是同一个 线程进入写锁的前提条件...然后就是总结这个锁机制的特性了: (a).重入方面其内部的WriteLock可以获取ReadLock,但是反过来ReadLock想要获得WriteLock则永远都不要想。
简介 ReentrantLock重入锁,由于它的加锁和解锁操作需要手动来完成,所以也称为显式锁。...* Thread-1释放了锁 * Thread-0获得了锁 * Thread-0释放了锁 */ 可重入性 可重入性是指线程获得锁之后,没有释放锁,当再次需要获得同一把锁的时候仍然可以成功。...如果锁是不可重入的,第二次获得锁的时候就会导致死锁。...state变量记录了锁的重入次数,每次lock()方法的调用会使state加1,每次unlock()方法的调用会使state减1,当state为0时锁被释放,将锁的持有者设置为null。...参考资料: 《Java并发编程之美》 一文彻底理解ReentrantLock可重入锁的使用
使用Java进行多线程开发,使用锁是一个几乎不可避免的问题。今天,就让我们来聊一聊这个基础,但是又特别特别重要的话题。 首先,让我们来看一下,到底什么是锁? 以及,为什么要使用锁?...Java中的重入锁 Java中的锁都来自与Lock接口,如下图中红框内的,就是重入锁。 ?...重入锁的实现原理 重入锁内部实现的主要类如下图: ? 重入锁的核心功能委托给内部类Sync实现,并且根据是否是公平锁有FairSync和NonfairSync两种实现。这是一种典型的策略模式。...重入锁的使用示例 为了让大家更好的理解重入锁的使用方法。现在我们使用重入锁,实现一个简单的计数器。...默认情况下,重入锁是非公平的,公平的重入锁性能差于非公平锁 重入锁的内部实现是基于CAS操作的。
java重入锁和同步锁有什么区别 在Java中,重入锁(ReentrantLock)和同步锁(Synchronized)都是用于实现线程同步的机制,但它们有一些区别。...可重入性: 重入锁是可重入的,也就是说,同一个线程可以多次获取同一个重入锁而不会产生死锁。在获取锁之后,线程可以多次进入被保护的代码块,并且每次退出代码块时都要释放锁。 同步锁也是可重入的。...当一个线程获取到同步锁后,可以再次获取同一个锁而不会产生死锁。同步锁的可重入性是由Java虚拟机自动实现的。...什么场景用重入锁好 重入锁(ReentrantLock)在以下场景中通常比同步锁(Synchronized)更适用: 公平性要求:重入锁可以通过构造函数的参数设置为公平锁,从而按照线程请求锁的顺序来获取锁...但在一些简单的同步场景中,同步锁通常更加方便和易用。 重入锁如何锁类 重入锁(ReentrantLock)提供了一个条件变量(Condition)机制,可以用于线程之间的通信和协作。
可重入锁 / 不可重入锁 可重入锁 广义上的可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁(前提得是同一个对象或者class),这样的锁就叫做可重入锁。...看到一个经典的讲解,使用自旋锁来模拟一个不可重入锁,代码如下 import java.util.concurrent.atomic.AtomicReference; public class UnreentrantLock...把它变成一个可重入锁: import java.util.concurrent.atomic.AtomicReference; public class UnreentrantLock {...在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS实现的。...2、上面Java实现的自旋锁不是公平的,即无法满足等待时间最长的线程优先获取锁。不公平的锁就会存在“线程饥饿”问题。
作者:汤圆 个人博客:javalover.cc 前言 在前面并发的开篇,我们介绍过内置锁synchronized; 这节我们再介绍下显式锁Lock 显式锁包括:可重入锁ReentrantLock、读写锁...ReadWriteLock 关系如下所示: 简介 显式锁和内置锁最大的区别就是:显式锁需手动获取锁和释放锁,而内置锁不需要 关于显式锁,本节会分别介绍可它的实现类 - 可重入锁,以及它的相关类 - 读写锁...可重入锁,实现了显式锁,意思就是可重入的显式锁(内置锁也是可重入的) 读写锁,将显式锁分为读写分离,即读读可并行,多个线程同时读不会阻塞(读写,写写还是串行) 下面让我们开始吧 文章如果有问题,欢迎大家批评指正...,在此谢过啦 目录 可重入锁 ReentrantLock 读写锁 ReadWriteLock 区别 正文 1.可重入锁 ReentrantLock 我们先来看下它的几个方法: public ReentrantLock...,则推荐用读写锁(成对的读锁和写锁需从同一个读写锁类获取) 参考内容: 《Java并发编程实战》 《实战Java高并发》 后记 最后,祝愿所有人都心想事成,阖家欢乐
领取专属 10元无门槛券
手把手带您无忧上云