首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java不可重入和可重入理解

最近正在阅读Java ReentrantLock源码,始终对可重入和不可重入概念理解不透彻,进行学习后记录在这里。...基础知识 Java多线程wait()方法和notify()方法 这两个方法是成对出现和使用,要执行这两个方法,有一个前提就是,当前线程必须获其对象monitor(俗称“”),否则会抛出IllegalMonitorStateException...wait():阻塞当前线程 notify():唤起被wait()阻塞线程 不可重入 所谓不可重入,即若当前线程执行某个方法已经获取了该,那么在方法中尝试再次获取时,就会获取不到被阻塞。...这个例子很好说明了不可重入。 可重入 接下来,我们设计一种可重入 ? 所谓可重入,意味着线程可以进入它已经拥有的同步代码块儿。...可重入概念和设计思想大体如此,Java重入ReentrantLock设计思路也是这样

1.8K11

java重入与不可重入

synchronized 和 ReentrantLock 都是可重入。 可重入意义在于防止死锁。 实现原理是通过为每个关联一个请求计数器和一个占有它线程。...直到计数器为0,被释放。 关于父类和子类重入:子类覆写了父类synchonized方法,然后调用父类中方法,此时如果没有重入,那么这段代码将产生死锁(很好理解吧)。...A类对象,而其他线程是不可以,这就是可重入。...可重入概念和设计思想大体如此,Java重入ReentrantLock设计思路也是这样。 synchronized和ReentrantLock 都是可重入。...摘自:JAVA重入与不可重入Java不可重入和可重入理解 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/153277.html原文链接:https

91420
您找到你想要的搜索结果了吗?
是的
没有找到

Java重入ReentrantLock

简介 ReentrantLock重入,是实现Lock接口一个类,也是在实际编程中使用频率很高一个,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该再次获取不会被阻塞。...在java关键字synchronized隐式支持重入性。synchronized通过获取自增,释放自减方式实现重入。与此同时,ReentrantLock还支持公平和非公平两种方式。...重入重入性关键点在于以下两个方面: 1、在线程获取时候,如果已经获取线程是当前线程的话则直接再次获取成功; 2、由于会被获取n次,那么只有锁在被释放同样n次之后,该才算是完全释放成功。...公平和非公平 ReentrantLock支持两种:公平和非公平。何谓公平性,是针对获取而言,如果一个是公平,那么获取顺序就应该符合请求上绝对时间顺序,满足FIFO。..., java.io.Serializable 说明:ReentrantLock实现了Lock接口,Lock接口中定义了lock与unlock相关操作,并且还存在newCondition方法,表示生成一个条件

52330

Java不可重入和可重入理解

大家好,又见面了,我是你们朋友全栈君。 最近正在阅读Java ReentrantLock源码,始终对可重入和不可重入概念理解不透彻,进行学习后记录在这里。...基础知识 Java多线程wait()方法和notify()方法 这两个方法是成对出现和使用,要执行这两个方法,有一个前提就是,当前线程必须获其对象monitor(俗称“”),否则会抛出IllegalMonitorStateException...wait():阻塞当前线程 notify():唤起被wait()阻塞线程 不可重入 所谓不可重入,即若当前线程执行某个方法已经获取了该,那么在方法中尝试再次获取时,就会获取不到被阻塞。...这个例子很好说明了不可重入。...可重入概念和设计思想大体如此,Java重入ReentrantLock设计思路也是这样 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/153238.html

33310

探索JAVA并发 - 可重入和不可重入

CAS主要通过compareAndSwapXXX()方法来实现,而这个方法实现需要涉及底层unsafe类 unsafe类:java不能直接访问操作系统底层,而是通过本地方法来访问。...这时就无法再调用doAdd()方法,这时必须先释放才能调用,所以称这种为不可重入,也叫自旋。...第一个线程执行print()方法,得到了,使lockedBy等于当前线程,也就是说,执行这个方法线程获得了这个,执行add()方法时,同样要先获得,因不满足while循环条件,也就是不等待,...只有当第一个线程释放了所有的,执行了notify()方法,第二个线程才得以跳出循环,继续执行。 这就是可重入特点。...java中常用重入 synchronized java.util.concurrent.locks.ReentrantLock AtomicIntegerFieldUpdater:原子更新整型字段更新器

76221

Java重入

所谓重入,指的是以线程为单位,当一个线程获取对象之后,这个线程可以再次获取本对象上,而其他线程是不可以。 synchronized 和 ReentrantLock 都是可重入。...可重入意义在于防止死锁。 可重入简单演示 什么是 “可重入”,可重入就是说某个线程已经获得某个,可以再次获取而不会出现死锁。...关于父类和子类重入:子类覆写了父类synchonized方法,然后调用父类中方法,此时如果没有重入,那么这段代码将产生死锁(很好理解吧)。...A类对象,而其他线程是不可以,这就是可重入。...可重入概念和设计思想大体如此,Java重入ReentrantLock设计思路也是这样。 synchronized和ReentrantLock 都是可重入

1.2K40

Java种类以及辨析:可重入

作为并发共享数据,保证一致性工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) 。...这些已经写好提供为我们开发提供了便利,但是具体性质以及类型却很少被提及。本系列文章将分析JAVA下常见名称以及特性,为大家答疑解惑。...四、可重入: 本文里面讲的是广义上重入,而不是单指JAVAReentrantLock。...可重入,也叫做递归,指的是同一线程 外层函数获得之后 ,内层递归函数仍然有获取该代码,但不受影响。...在JAVA环境下 ReentrantLock 和synchronized 都是 可重入 下面是使用实例: ? ? 两个例子最后结果都是正确,即 同一个线程id被连续输出两次。

70310

重入和不可重入区别

不可重入示例(同一个线程不可以重入上锁后代码段) 如下是一个不可重入逻辑过程,会发现执行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

43210

java并发之重入-ReentrantLock

前言 目前主流有两种,一种是synchronized,另一种就是ReentrantLock,JDK优化到现在目前为止synchronized性能已经和重入不分伯仲了,但是重入功能和灵活性要比这个关键字多多...,所以重入是可以完全替代synchronized关键字。...下面就来介绍这个重入。 正文 ReentrantLock重入是Lock接口里最重要实现,也是在实际开发中应用最多一个,我这篇文章更接近实际开发应用场景,为开发者提供直接上手应用。...第一种声明是公平,所谓公平,就是按照时间先后顺序,使先等待线程先得到,而且,公平不会产生饥饿,也就是只要排队等待,最终能等待到获取机会。...第二种声明是非公平,所谓非公平就和公平概念相反,线程等待顺序并不一定是执行顺序,也就是后来进来线程可能先被执行。

37230

Java并发-16.重入

重入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

40250

Java多线程及重入

使用线程根本上是为了更充分利用cpu资源。 线程状态 查看Java源码可知,线程状态一共有6种,分别是新建、运行、阻塞、等待、超时等待、终止。...什么是重入 ReentrantLock是实现Lock接口一个类,支持重入性。线程在被两次lock加锁后会被阻塞,在复杂调用场景中为了避免这种情况,于是就有了可重入。...使用condition condition是重入伴生对象。它提供了在重入基础上,进行等待和通知机制。...现在我们使用重入,实现一个简单计数器。...对于同一个线程,重入允许你反复获得一把,但是,申请和释放次数必须一致。 默认情况下,重入是非公平,公平重入性能差于非公平 重入内部实现是基于CAS操作

56320

Java 重入 ReentrantLock 原理分析

2.原理 本章将会简单介绍重入 ReentrantLock 中一些概念和相关原理,包括可重入、公平和非公平等原理。...是 ✅ 是否可尝试加锁 否 是 ❌ 是否是Java内置特性 是 否 ❌ 自动获取/释放 是 否 ❌ 对异常处理 自动释放 需手动释放 ❌ 除此之外,ReentrantLock 提供了丰富接口用于获取状态...由于 m1 和 m2 使用是同一把可重入,所以线程 t 可以进入方法 m2,并再次获得,而不会被阻塞住。...不过好在《Java并发编程实战》在第13.3节 公平性(p232)说明了具体原因,这里引用一下: 在激烈竞争情况下,非公平性能高于公平性能一个原因是:在恢复一个被挂起线程与该线程真正开始运行之间存在着严重延迟...线程 C 在抢占情况下,仍未影响线程 B 获取,因此是个“双赢”局面。 除了上面的原因外,《Java并发编程艺术》在其5.3.2 公平与非公平区别(p137)分析了另一个可能原因。

1.4K252

重入

使用Java进行多线程开发,使用是一个几乎不可避免问题。今天,就让我们来聊一聊这个基础,但是又特别特别重要的话题。 首先,让我们来看一下,到底什么是? 以及,为什么要使用?...Java重入 Java都来自与Lock接口,如下图中红框内,就是重入。 ?...重入实现原理 重入内部实现主要类如下图: ? 重入核心功能委托给内部类Sync实现,并且根据是否是公平有FairSync和NonfairSync两种实现。这是一种典型策略模式。...重入使用示例 为了让大家更好理解重入使用方法。现在我们使用重入,实现一个简单计数器。...默认情况下,重入是非公平,公平重入性能差于非公平 重入内部实现是基于CAS操作

42030

java读写实现原理_java重入原理

两种锁定方式各有优劣,下面简单对比一下: 1、synchronized是关键字,就和if…else…一样,是语法层面的实现,因此synchronized获取以及释放都是Java虚拟机帮助用户完成;...二、读写:分为读和写,多个读不互斥,读与写互斥,这是由jvm自己控制,你只要上好相应即可。...如果你代码只读数据,可以很多人同时读,但不能同时写,那就上读;如果你代码修改数据,只能有一个人在写,且不能同时读取,那就上写。总之,读时候上读,写时候上写!...ReentrantReadWriteLock会使用两把来解决问题,一个读,一个写 线程进入读前提条件: 没有其他线程, 没有写请求或者有写请求,但调用线程和持有线程是同一个 线程进入写前提条件...然后就是总结这个机制特性了: (a).重入方面其内部WriteLock可以获取ReadLock,但是反过来ReadLock想要获得WriteLock则永远都不要想。

48010

聊聊java两种同步重入

java重入和同步有什么区别 在Java中,重入(ReentrantLock)和同步(Synchronized)都是用于实现线程同步机制,但它们有一些区别。...可重入性: 重入是可重入,也就是说,同一个线程可以多次获取同一个重入而不会产生死锁。在获取之后,线程可以多次进入被保护代码块,并且每次退出代码块时都要释放。 同步也是可重入。...当一个线程获取到同步后,可以再次获取同一个而不会产生死锁。同步重入性是由Java虚拟机自动实现。...什么场景用重入锁好 重入(ReentrantLock)在以下场景中通常比同步(Synchronized)更适用: 公平性要求:重入可以通过构造函数参数设置为公平,从而按照线程请求顺序来获取...但在一些简单同步场景中,同步通常更加方便和易用。 重入如何重入(ReentrantLock)提供了一个条件变量(Condition)机制,可以用于线程之间通信和协作。

15210

Java 中15种介绍:公平,可重入,独享,互斥

重入 / 不可重入重入 广义上重入指的是可重复可递归调用,在外层使用之后,在内层仍然可以使用,并且不发生死锁(前提得是同一个对象或者class),这样就叫做可重入。...看到一个经典讲解,使用自旋来模拟一个不可重入,代码如下 import java.util.concurrent.atomic.AtomicReference; public class UnreentrantLock...把它变成一个可重入: import java.util.concurrent.atomic.AtomicReference; public class UnreentrantLock {...在Javajava.util.concurrent.atomic包下面的原子变量类就是使用了乐观一种实现方式CAS实现。...2、上面Java实现自旋不是公平,即无法满足等待时间最长线程优先获取。不公平就会存在“线程饥饿”问题。

53912

Java并发-显式篇【可重入+读写

作者:汤圆 个人博客:javalover.cc 前言 在前面并发开篇,我们介绍过内置synchronized; 这节我们再介绍下显式Lock 显式包括:可重入ReentrantLock、读写...ReadWriteLock 关系如下所示: 简介 显式和内置最大区别就是:显式需手动获取和释放,而内置不需要 关于显式,本节会分别介绍可它实现类 - 可重入,以及它相关类 - 读写...可重入,实现了显式,意思就是可重入显式(内置也是可重入) 读写,将显式分为读写分离,即读读可并行,多个线程同时读不会阻塞(读写,写写还是串行) 下面让我们开始吧 文章如果有问题,欢迎大家批评指正...,在此谢过啦 目录 可重入 ReentrantLock 读写 ReadWriteLock 区别 正文 1.可重入 ReentrantLock 我们先来看下它几个方法: public ReentrantLock...,则推荐用读写(成对和写需从同一个读写类获取) 参考内容: 《Java并发编程实战》 《实战Java高并发》 后记 最后,祝愿所有人都心想事成,阖家欢乐

49910
领券