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

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

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

52310

Java 重入 ReentrantLock 原理分析

ReentrantLock 是我们日常使用很频繁的一种,所以在使用之余,我们也应该去了解一下它的内部实现原理。...2.原理 本章将会简单介绍重入 ReentrantLock 中的一些概念和相关原理,包括可重入、公平和非公平原理。...在介绍这些原理前,首先我会介绍 ReentrantLock 与 synchronized 关键字的相同和不同之处。在此之后才回去介绍重入、公平和非公平等原理。...是 ✅ 是否可尝试加锁 否 是 ❌ 是否是Java内置特性 是 否 ❌ 自动获取/释放 是 否 ❌ 对异常的处理 自动释放 需手动释放 ❌ 除此之外,ReentrantLock 提供了丰富的接口用于获取的状态...4.总结 本文分析了可重入 ReentrantLock 公平与非公平获取以及释放原理,并与 synchronized 关键字进行了类比。

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

    Java不可重入和可重入理解

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

    1.9K11

    java重入与不可重入

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

    1.1K20

    Java中可重入ReentrantLock原理剖析

    一、 概述 本文首先介绍Lock接口、ReentrantLock的类层次结构以及功能模板类AbstractQueuedSynchronizer的简单原理,然后通过分析ReentrantLock的lock...方法和unlock方法,来解释ReentrantLock的内部原理,最后做一个总结。...也就是说,同一时间内只有一个线程可以获取这个并占用资源。其他线程想要获取,必须等待这个线程释放。在Java实现中的ReentrantLock就是这样的。...0,如果是0,则尝试去原子抢占这个(设置状态为1,然后把当前线程设置成独占线程),如果当前的状态不是0,就去比较当前线程和占用的线程是不是一个线程,如果是,会去增加状态变量的值,从这里看出可重入之所以可重入...2、进入release方法,内部先尝试tryRelease操作,主要是去除的独占线程,然后将状态减一,这里减一主要是考虑到可重入可能自身会多次占用,只有当状态变成0,才表示完全释放了

    62720

    Java不可重入和可重入理解

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

    44010

    快速了解重入实现原理

    什么是重入? 从字面意思理解就是“重新进入同步区域”,同一个线程,多次获取一把。 哪些支持重入呢?...Synchronized synchronized是支持重入的,它是隐式的获取去重入,如下: package com.ams.thread.lesson7; import lombok.extern.slf4j.Slf4j...我们前面实现了一个,但是它是不支持重入的,我们现在给他进行改造: 手写一个重入 改造的关键点: 获取时,需要判断当前是否被占用,如果没有被占用则获取,否则判断是否是当前线程占用,如果是则计数加...的释放,释放时要判断是否是当前线程,如果是,则计数减1,直到为0 ,才是真正释放 上代码 package com.ams.thread.lesson7; import java.util.concurrent.TimeUnit...; import java.util.concurrent.locks.Lock; /** * 关注微信公众号"AI码师"获取项目源码及2021面试题一套 * 实现重入 * * @author

    27810

    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(

    54730

    轻松学习java重入(ReentrantLock)的实现原理

    前言 相信学过java的人都知道 synchronized 这个关键词,也知道它用于控制多线程对并发资源的安全访问,兴许,你还用过Lock相关的功能,但你可能从来没有想过java中的底层的机制是怎么实现的...如果真是这样,而且你有兴趣了解,今天我将带领你轻松的学习下java中非常重要,也非常基础的可重入-ReentrantLock的实现机制。...java重入-ReentrantLock实现细节 ReentrantLock支持两种获取的方式,一种是公平模型,一种是非公平模型。在继续之前,咱们先把故事元素转换为程序元素。...当A再次请求,就相当于是打水期间,同一家人也来打水了,是有特权的,这时候的状态如下图所示: 到了这里,相信大家应该明白了什么是可重入了吧。...结束语 可重入的实现会涉及到CAS,AQS,java内存可见性(volatile)等知识,为了避免大家直接被代码搞晕,故而想以最简单的方式把可重入进行抽象,讲明白其中的实现原理,这样看起源码也有个借鉴的思路

    29310

    java并发之重入-ReentrantLock

    前言 目前主流的有两种,一种是synchronized,另一种就是ReentrantLock,JDK优化到现在目前为止synchronized的性能已经和重入不分伯仲了,但是重入的功能和灵活性要比这个关键字多的多...,所以重入是可以完全替代synchronized关键字的。...下面就来介绍这个重入。 正文 ReentrantLock重入是Lock接口里最重要的实现,也是在实际开发中应用最多的一个,我这篇文章更接近实际开发的应用场景,为开发者提供直接上手应用。...一、首先先看声明一个重入需要使用到那几个构造方法 public ReentrantLock() { sync = new NonfairSync(); } public ReentrantLock...,没有得到的会在队列里不停的利用CAS原理试图得到,CAS很高效,也就是,为什么ReentrantLock比synchronized高效的原因,缺点是很浪费cpu资源。

    41230

    Java多线程及重入

    所以在Java中更多的应该考虑线程。进程的内存是可以被多个线程共享使用的。 使用线程根本上是为了更充分的利用cpu资源。...线程的状态 查看Java源码可知,线程的状态一共有6种,分别是新建、运行、阻塞、等待、超时等待、终止。...重入性实现原理 在AbstractQueuedSynchronizer对象里有个状态变量state,state为0表示空闲,大于0表示被占用,数值表示当前线程重复占用的次数。...使用condition condition是重入的伴生对象。它提供了在重入的基础上,进行等待和通知的机制。...对于同一个线程,重入允许你反复获得一把,但是,申请和释放的次数必须一致。 默认情况下,重入是非公平的,公平的重入性能差于非公平 重入的内部实现是基于CAS操作的。

    60620

    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

    42050

    重入

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

    46030

    重入和不可重入的区别

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