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

java重入与不可重入

所谓重入,指的是以线程为单位,当一个线程获取对象之后,这个线程可以再次获取本对象上的,而其他的线程是不可以的。 synchronized 和 ReentrantLock 都是重入。...重入的意义在于防止死锁。 实现原理是通过为每个关联一个请求计数器和一个占有它的线程。...重入: 接下来,我们设计一种重入 public class Lock{ boolean isLocked = false; Thread lockedBy = null;...重入的概念和设计思想大体如此,Java中的重入ReentrantLock设计思路也是这样。 synchronized和ReentrantLock 都是重入。...摘自:JAVA重入与不可重入Java不可重入重入理解 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/153277.html原文链接:https

1.1K20

Java不可重入重入理解

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

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

    Java不可重入重入理解

    最近正在阅读Java ReentrantLock源码,始终对重入和不可重入概念理解不透彻,进行学习后记录在这里。...wait():阻塞当前线程 notify():唤起被wait()阻塞的线程 不可重入 所谓不可重入,即若当前线程执行某个方法已经获取了该,那么在方法中尝试再次获取时,就会获取不到被阻塞。...这个例子很好的说明了不可重入。...重入 接下来,我们设计一种重入 public class Lock{ boolean isLocked = false; Thread lockedBy = null;...重入的概念和设计思想大体如此,Java中的重入ReentrantLock设计思路也是这样 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/153238.html

    44010

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

    什么是重入,什么是不可重入,它们是如何实现的?...定义 重入:当线程获取某个后,还可以继续获取它,可以递归调用,而不会发生死锁; 不可重入:与重入相反,获取后不能重复获取,否则会死锁(自己自己)。 不可重入 用代码说话。...重入 不可重入扩展一下,增加一个计数器,同一个线程每次获取计数器加1,释放减1,为0时释放。...基于自旋实现重入 直接用上个例子的代码改一下: import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.locks.ReentrantLock...ReentrantLock ReentrantLock是Java中很常见的工具类, 从名字就可以看出,它是个重入,用法也很简单: import java.util.concurrent.locks.ReentrantLock

    2.9K41

    重入

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

    76820

    Java中的重入

    所谓重入,指的是以线程为单位,当一个线程获取对象之后,这个线程可以再次获取本对象上的,而其他的线程是不可以的。 synchronized 和 ReentrantLock 都是重入。...重入的意义在于防止死锁。 重入简单演示 什么是 “重入”,重入就是说某个线程已经获得某个,可以再次获取而不会出现死锁。...,重入,就是可以重复获取相同的,synchronized和ReentrantLock都是重入的 //重入降低了编程复杂性 public class WhatReentrant { public...重入: 接下来,我们设计一种重入 public class Lock{ boolean isLocked = false; Thread lockedBy = null;...重入的概念和设计思想大体如此,Java中的重入ReentrantLock设计思路也是这样。 synchronized和ReentrantLock 都是重入

    1.3K40

    重入详解(什么是重入

    重入详解 概述 什么是 “重入”,重入就是说某个线程已经获得某个,可以再次获取而不会出现死锁。...例如 package com.test.reen; // 演示重入是什么意思,重入,就是可以重复获取相同的,synchronized和ReentrantLock都是重入的 // 重入降低了编程复杂性...import java.util.concurrent.locks.ReentrantLock; // 演示重入是什么意思 public class WhatReentrant2 {...重入有 synchronized ReentrantLock 使用ReentrantLock的注意点 ReentrantLock 和 synchronized 不一样,需要手动释放,所以使用 ReentrantLock...的时候一定要手动释放,并且加锁次数和释放次数要一样 以下代码演示,加锁和释放次数不一样导致的死锁 package com.test.reen; import java.util.Random; import

    86830

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

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

    52210

    重入和自旋

    重入 重入就是说某个线程已经获得某个,可以再次获取而不会出现死锁。 synchronized和ReentrantLock都是重入的。...重入的一个好处是一定程度避免死锁。 methodA 调用 methodB,如果一个线程调用methodA 已经获取了再去调用 methodB 就不需要再次获取了,这就是重入的特性。...如果不是重入的话,mehtodB 可能不会被当前线程执行,从而可能造成死锁。...自旋是一种用于保护多线程共享资源的,与一般互斥(mutex)不同之处在于当自旋尝试获取时以 忙等待(busy waiting) 的形式不断地循环检查是否可用。...重入和自旋的优缺点: 自旋的优点在于,因为自旋不会引起调用者睡眠,所以不会进行线程调度,CPU时间片轮转等耗时操作。所以如果能在很短的时间内获得,自旋的效率远高于互斥

    14910

    重入和不可重入的区别

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

    45910

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

    作者:汤圆 个人博客:javalover.cc 前言 在前面并发的开篇,我们介绍过内置synchronized; 这节我们再介绍下显式Lock 显式包括:重入ReentrantLock、读写...ReadWriteLock 关系如下所示: 简介 显式内置最大的区别就是:显式需手动获取和释放,而内置不需要 关于显式,本节会分别介绍它的实现类 - 重入,以及它的相关类 - 读写...重入,实现了显式,意思就是重入的显式内置也是重入的) 读写,将显式分为读写分离,即读读并行,多个线程同时读不会阻塞(读写,写写还是串行) 下面让我们开始吧 文章如果有问题,欢迎大家批评指正...区别 我们用表格来展示吧,细节如下: 的特点内置重入读写灵活性低高高公平性不确定非公平(默认)+公平非公平(默认)+公平定时性无可定时定时中断性无可中断中断互斥性互斥互斥读读共享,其他都互斥建议优先选择内置...,只有在内置满足不了需求时,再采用显式(比如定时、中断、公平性) 如果是读多写少的场景(比如配置数据),推荐用读写 总结 重入 ReentrantLock:需显式获取和释放,切记要在

    54010

    Java重入ReentrantLock原理剖析

    也就是说,同一时间内只有一个线程可以获取这个并占用资源。其他线程想要获取,必须等待这个线程释放。在Java实现中的ReentrantLock就是这样的。...另外一种,它可以允许多个线程读取资源,但是只能允许一个线程写入资源,ReadWriteLock就是这样一种特殊的,简称读写。下面是对Lock接口的几个方法的总体描述: ? ?...0,如果是0,则尝试去原子抢占这个(设置状态为1,然后把当前线程设置成独占线程),如果当前的状态不是0,就去比较当前线程和占用的线程是不是一个线程,如果是,会去增加状态变量的值,从这里看出重入之所以重入...2、进入release方法,内部先尝试tryRelease操作,主要是去除的独占线程,然后将状态减一,这里减一主要是考虑到重入可能自身会多次占用,只有当状态变成0,才表示完全释放了。...四、 公平和非公平的区别 公平和非公平,在CHL队列抢占模式上都是一致的,也就是在进入acquireQueued这个方法之后都一样,它们的区别在初次抢占上有区别,也就是tryAcquire上的区别

    62720

    关于乐观、悲观重入....

    并发编程----乐观、悲观重入….. 作为一个Java开发多年的人来说,肯定多多少少熟悉一些,或者听过一些。今天就来做一个锁相关总结。 ?...在Javajava.util.concurrent.atomic包下面的原子变量就是使用了乐观的一种实现方式CAS实现。 通常都是 使用version、时间戳等来比较是否已被其他线程修改过。...update t_user set name="Java后端技术全栈" where t_version=1 使用悲观还是使用乐观?...重入 若当前线程执行中已经获取了,如果再次获取该时,就会获取不到被阻塞。...重入也叫递归,指的是同一线程外层函数获得之后,内层递归函数仍然有获取该的代码,但不受影响。

    51410

    代码实例详解【重入】和【不可重入】区别?

    之前文章重点单独介绍过Synchronized和Reentrantlock,不明白的同学可以先看看了解: currentHashMap的公平中断响应,限制等待实例 这篇文章主要是介绍重入和不可重入...,在jdk中synchronized和Reentrantlock,都是重入,为了更高效的性能和防止发生死锁。...重入可以理解为:同一个线程下,外层方法上锁之后,内层调用的方法也能正常获取。 下面先用代码介绍对【不可重入】的理解。...这就是不可重入重入是什么呢?...Jdk中带的基本都是重入,下面就用synchronized实例介绍,在锁住同一个object之后,控制台打印可以看出,threadA调用threadB方法,B和A方法不会发生死锁,业务都能进行下去。

    60620

    【并发编程】重入和读写

    重入ReentrantLock 何为重入: 重进入是指任意线程在获取到之后能够再次获取该而不会被阻塞 import java.util.concurrent.CopyOnWriteArrayList...; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class...; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class...; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class...读写ReentrantReadWriteLock 核心是实现读写分离的 在高并发访问下 尤其是读多写少 性能远高于重入 本质是分成两个和写 在读下 多个线程可以并发的进行访问 但在写的时候

    32040
    领券