首页
学习
活动
专区
工具
TVP
发布

Java不可重入和可重入理解

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

1.8K11

java重入与不可重入

所谓重入,指的是以线程为单位,当一个线程获取对象之后,这个线程可以再次获取本对象上的,而其他的线程是不可以的。 synchronized 和 ReentrantLock 都是可重入。...true; } public synchronized void unlock(){ isLocked = false; notify(); } } 使用...可重入的概念和设计思想大体如此,Java中的可重入ReentrantLock设计思路也是这样。 synchronized和ReentrantLock 都是可重入。...ReentrantLock与synchronized比较: 1.前者使用灵活,但是必须手动开启和释放 2.前者扩展性好,有时间等候(tryLock( )),可中断等候(lockInterruptibly...摘自:JAVA重入与不可重入Java不可重入和可重入理解 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/153277.html原文链接:https

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

Java不可重入和可重入理解

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

33110

Java重入ReentrantLock

简介 ReentrantLock重入,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该再次获取不会被阻塞。...在java关键字synchronized隐式支持重入性。synchronized通过获取自增,释放自减的方式实现重入。与此同时,ReentrantLock还支持公平和非公平两种方式。...重入重入性关键点在于以下两个方面: 1、在线程获取的时候,如果已经获取的线程是当前线程的话则直接再次获取成功; 2、由于会被获取n次,那么只有锁在被释放同样的n次之后,该才算是完全释放成功。...这些特性是如何做到的,那就看下面的源码分析,以下部分建议先看上一篇文章再看理解起来或许简单点 源码分析 1 类的继承关系  public class ReentrantLock implements Lock, java.io.Serializable...s) throws java.io.IOException, ClassNotFoundException { s.defaultReadObject(

52330

java并发之重入-ReentrantLock

前言 目前主流的有两种,一种是synchronized,另一种就是ReentrantLock,JDK优化到现在目前为止synchronized的性能已经和重入不分伯仲了,但是重入的功能和灵活性要比这个关键字多的多...,所以重入是可以完全替代synchronized关键字的。...下面就来介绍这个重入。 正文 ReentrantLock重入是Lock接口里最重要的实现,也是在实际开发中应用最多的一个,我这篇文章更接近实际开发的应用场景,为开发者提供直接上手应用。...一、首先先看声明一个重入需要使用到那几个构造方法 public ReentrantLock() { sync = new NonfairSync(); } public ReentrantLock...非公平由于允许插队所以,上下文切换少的多,性能比较好,保证的大的吞吐量,但是容易出现饥饿问题。所以实际生产也是较多的使用非公平。 非公平调用的是NonfairSync方法。

36930

Java多线程及重入

所以在Java中更多的应该考虑线程。进程的内存是可以被多个线程共享使用的。 使用线程根本上是为了更充分的利用cpu资源。...重入和synchronized区别 性能上和synchronized几乎没区别,但是ReentrantLock功能更丰富,支持公平和非公平,更适合并发场景 使用上synchronized更简单,...使用condition condition是重入的伴生对象。它提供了在重入的基础上,进行等待和通知的机制。...现在我们使用重入,实现一个简单的计数器。...对于同一个线程,重入允许你反复获得一把,但是,申请和释放的次数必须一致。 默认情况下,重入是非公平的,公平的重入性能差于非公平 重入的内部实现是基于CAS操作的。

55720

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中的可重入

重入的意义在于防止死锁。 可重入简单演示 什么是 “可重入”,可重入就是说某个线程已经获得某个,可以再次获取而不会出现死锁。...ReentrantLock 和 synchronized 不一样,需要手动释放,所以使用 ReentrantLock的时候一定要手动释放,并且加锁次数和释放次数要一样 例如 //演示可重入是什么意思...可以发现没发生死锁,可以多次获取相同的重入有 synchronized ReentrantLock 使用ReentrantLock的注意点 ReentrantLock 和 synchronized...可重入的概念和设计思想大体如此,Java中的可重入ReentrantLock设计思路也是这样。 synchronized和ReentrantLock 都是可重入。...ReentrantLock与synchronized比较: 前者使用灵活,但是必须手动开启和释放 前者扩展性好,有时间等候(tryLock( )),可中断等候(lockInterruptibly(

1.1K40

Java 重入 ReentrantLock 原理分析

ReentrantLock 是我们日常使用很频繁的一种,所以在使用之余,我们也应该去了解一下它的内部实现原理。...2.原理 本章将会简单介绍重入 ReentrantLock 中的一些概念和相关原理,包括可重入、公平和非公平等原理。...2.2 可重入重入这个概念并不难理解,本节通过一个例子简单说明一下。 现在有方法 m1 和 m2,两个方法均使用了同一把对方法进行同步控制,同时方法 m1 会调用 m2。...由于 m1 和 m2 使用的是同一把可重入,所以线程 t 可以进入方法 m2,并再次获得,而不会被阻塞住。...本节最后说一下公平和非公平使用场景。如果线程持时间短,则应使用非公平,可通过“插队”提升效率。如果线程持时间长,“插队”带来的效率提升可能会比较小,此时应使用公平。 3.

1.4K252

重入

使用Java进行多线程开发,使用是一个几乎不可避免的问题。今天,就让我们来聊一聊这个基础,但是又特别特别重要的话题。 首先,让我们来看一下,到底什么是? 以及,为什么要使用?...什么是重入? 好了,现在大家知道我们为什么要使用了。那什么是重入呢。通常情况下,可以用来控制多线程的访问行为。那对于同一个线程,如果连续两次对同一把进行lock,会怎么样了?...Java中的重入 Java中的都来自与Lock接口,如下图中红框内的,就是重入。 ?...当然了,当使用完后,千万不要忘记把它释放了。不然,程序可能就会崩溃啦~ void unlock() :释放 此外, 重入还有一个不带任何参数的tryLock()。...重入使用示例 为了让大家更好的理解重入使用方法。现在我们使用重入,实现一个简单的计数器。

42030

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

两种锁定方式各有优劣,下面简单对比一下: 1、synchronized是关键字,就和if…else…一样,是语法层面的实现,因此synchronized获取以及释放都是Java虚拟机帮助用户完成的;...ReentrantReadWriteLock会使用两把来解决问题,一个读,一个写 线程进入读的前提条件: 没有其他线程的写, 没有写请求或者有写请求,但调用线程和持有的线程是同一个 线程进入写的前提条件...然后就是总结这个机制的特性了: (a).重入方面其内部的WriteLock可以获取ReadLock,但是反过来ReadLock想要获得WriteLock则永远都不要想。...这一特性最为重要,因为对于高读取频率而相对较低写入的数据结构,使用此类同步机制则可以提高并发量。...* JDK1.5自带的读写特性,读与读不互斥,读与写互斥,写与写互斥。 * 为什么要使用读写?一句话概括那就是提高系统性能,如何提高呢?

48010

Java并发编程之重入(ReentrantLock)

ReentrantLock的简单使用 一个ReentrantLock使用示例,对临界资源进行加锁,当线程访问临界资源时需要先获得,如果已经被其他线程所持有,则需要等待其他线程释放后再重新获取,直到获取之后才能继续执行...如果是不可重入的,第二次获得的时候就会导致死锁。...$main$0(ReentrantLockDemo.java:18) at java.base/java.lang.Thread.run(Thread.java:834) 公平策略 使用无参构造函数创建的...-0获得了 Thread-3获得了 Thread-4获得了 使用公平不会产生饥饿现象,由于要维护线程的顺序,使公平的效率低下,所以没特殊情况应该使用非公平。...参考资料: 《Java并发编程之美》 一文彻底理解ReentrantLock可重入使用

58320

重入和不可重入的区别

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

43110

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

作者:汤圆 个人博客:javalover.cc 前言 在前面并发的开篇,我们介绍过内置synchronized; 这节我们再介绍下显式Lock 显式包括:可重入ReentrantLock、读写...可重入,实现了显式,意思就是可重入的显式(内置也是可重入的) 读写,将显式分为读写分离,即读读可并行,多个线程同时读不会阻塞(读写,写写还是串行) 下面让我们开始吧 文章如果有问题,欢迎大家批评指正...,在此谢过啦 目录 可重入 ReentrantLock 读写 ReadWriteLock 区别 正文 1.可重入 ReentrantLock 我们先来看下它的几个方法: public ReentrantLock...、公平性选择、定时、中断,显式支持 建议使用时,优先考虑内置 因为现在内置的性能跟显式差别不大 而且显式因为需要手动释放(需在finally块中释放),所以会有忘记释放的风险 如果是读多写少的场合...,则推荐用读写(成对的读和写需从同一个读写类获取) 参考内容: 《Java并发编程实战》 《实战Java高并发》 后记 最后,祝愿所有人都心想事成,阖家欢乐

49910

重入

使用Java进行多线程开发,使用是一个几乎不可避免的问题。今天,就让我们来聊一聊这个基础,但是又特别特别重要的话题。 首先,让我们来看一下,到底什么是? 以及,为什么要使用?...为了避免类似的问题,我们就需要使用。让写线程在修改对象前,先加锁,然后完成姓名和电话号码的赋值,再释放。而读线程也是一样,先取得,再读,然后释放。这样就可以避免发生这种情况。...如下图所示: 总结 可重入算是多线程的入门级别知识点,所以我把他当做多线程系列的第一章节,对于重入,我们需要特别知道几点: 对于同一个线程,重入允许你反复获得通一把...默认情况下,重入是非公平的,公平的重入性能差于非公平 重入的内部实现是基于CAS操作的。...重入的伴生对象Condition提供了await()和singal()的功能,可以用于线程间消息通信。

74120
领券