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

Java线程重入

概述 每个Thread类的示例都代表一个线程,而进程是操作系统级别的多任务,JVM就是运行在一个进程当中的。所以在Java中更多的应该考虑线程。进程的内存是可以被多个线程共享使用的。...使用线程根本上是为了更充分的利用cpu资源。 线程的状态 查看Java源码可知,线程的状态一共有6种,分别是新建、运行、阻塞、等待、超时等待、终止。...什么是重入 ReentrantLock是实现Lock接口的一个类,支持重入性。线程在被两次lock加锁后会被阻塞,在复杂的调用场景中为了避免这种情况,于是就有了可重入。...默认情况下,重入是不公平的,多个线程竞争时不按照顺序来,而是随机获取。...对于同一个线程重入允许你反复获得一把,但是,申请和释放的次数必须一致。 默认情况下,重入是非公平的,公平的重入性能差于非公平 重入的内部实现是基于CAS操作的。

58820

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不可重入和可重入理解

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

38410

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

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

2.8K41

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

这时就无法再调用doAdd()方法,这时必须先释放才能调用,所以称这种为不可重入,也叫自旋。...:线程可以进入任何一个它已经拥有的所同步着的代码块。...第一个线程执行print()方法,得到了,使lockedBy等于当前线程,也就是说,执行的这个方法的线程获得了这个,执行add()方法时,同样要先获得,因不满足while循环的条件,也就是不等待,...只有当第一个线程释放了所有的,执行了notify()方法,第二个线程才得以跳出循环,继续执行。 这就是可重入的特点。...java中常用的可重入 synchronized java.util.concurrent.locks.ReentrantLock AtomicIntegerFieldUpdater:原子更新整型的字段的更新器

78621

Java重入ReentrantLock

简介 ReentrantLock重入,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该再次获取不会被阻塞。...在java关键字synchronized隐式支持重入性。synchronized通过获取自增,释放自减的方式实现重入。与此同时,ReentrantLock还支持公平和非公平两种方式。...重入重入性关键点在于以下两个方面: 1、在线程获取的时候,如果已经获取线程是当前线程的话则直接再次获取成功; 2、由于会被获取n次,那么只有锁在被释放同样的n次之后,该才算是完全释放成功。...[] 0获取的当前线程[3], 同步队列中的线程[] 1获取的当前线程[3], 同步队列中的线程[] 0获取的当前线程[4], 同步队列中的线程[] 1获取的当前线程[4], 同步队列中的线程[...] 0获取的当前线程[1], 同步队列中的线程[] 1获取的当前线程[1], 同步队列中的线程[] 非公平耗时:7 线程会重复获取

53630

深入解析ReentrantLock重入Java线程中的利器

Java线程编程中,是一项关键的技术,用于保护共享资源,确保线程安全。...ReentrantLock(可重入)是Java中强大而灵活的机制之一,本文将深入解析ReentrantLock的原理和使用方法。...ReentrantLock的基本概念ReentrantLock是Java.util.concurrent包中的一部分,是一种可重入的独占。可重入意味着同一个线程可以多次获取同一把而不会造成死锁。...2.3 可重入性ReentrantLock支持可重入性,同一线程可以多次获取,每次获取都必须有对应的释放操作。这使得线程可以嵌套地使用,而不会出现死锁。3....结语ReentrantLock是Java线程编程中非常强大的机制,它提供了可重入性、公平性、条件变量等丰富的特性,适用于各种复杂的同步需求。

34450

java并发之重入-ReentrantLock

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

39930

第三章:java线程重入学习「建议收藏」

重入,顾名思义,就是支持重进入的,它表示该能够支持一个线程对资源的重复加锁。重进入是指任意线程在获取到之后能够再次获取该而不会被阻塞,该特性的实现需要解决以下两个问题。...Java里面内置(synchronize)和Lock(ReentrantLock)都是可重入的 关键字synchronized拥有重入的功能,也就是在使用synchronized时,当一个线程得到了一个对象的后...可以看到线程t1执行完之后才执行的线程t3,最后执行的是线程t2,线程t1由方法method1要去执行由synchronized修饰的method2,直接便可以获取到,这种情况便是重入。...如果synchronized不支持重入的话,会造成死锁的情况(method1还没执行完,要执行method2,method2不让获取的话,method1就执行不完了)。...可见重入最大的作用是避免死锁 上面说的是一种重入的场景,重入还有一种常见的情形,那就是父子类的情况,再看一个例子 package com.xiaoyexinxin.ThreadLearn; public

9820

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

41050

Java 重入 ReentrantLock 原理分析

所谓的可重入是指,线程可对同一把进行重复加锁,而不会被阻塞住,这样可避免死锁的产生。ReentrantLock 的主要功能和 synchronized 关键字一致,均是用于多线程的同步。...由于 m1 和 m2 使用的是同一把可重入,所以线程 t 可以进入方法 m2,并再次获得,而不会被阻塞住。...不过好在《Java并发编程实战》在第13.3节 公平性(p232)说明了具体的原因,这里引用一下: 在激烈竞争的情况下,非公平的性能高于公平的性能的一个原因是:在恢复一个被挂起的线程与该线程真正开始运行之间存在着严重的延迟...线程 C 在抢占的情况下,仍未影响线程 B 获取,因此是个“双赢”的局面。 除了上面的原因外,《Java并发编程的艺术》在其5.3.2 公平与非公平的区别(p137)分析了另一个可能的原因。...,则将自己设为持锁线程后返回 若同步状态不为0,且当前线程为持锁线程,则执行重入逻辑 3.2.3 公平和非公平细节对比 如果大家之前阅读过公平和非公平的源码,会发现两者之间的差别不是很大。

1.4K252

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

两种锁定方式各有优劣,下面简单对比一下: 1、synchronized是关键字,就和if…else…一样,是语法层面的实现,因此synchronized获取以及释放都是Java虚拟机帮助用户完成的;...5、和synchronized相比,ReentrantLock提供给用户多种方法用于信息的获取,比如可以知道lock是否被当前线程获取、lock被同一个线程调用了几次、lock是否被任意线程获取等等...ReentrantReadWriteLock会使用两把来解决问题,一个读,一个写 线程进入读的前提条件: 没有其他线程的写, 没有写请求或者有写请求,但调用线程和持有线程是同一个 线程进入写的前提条件...: 没有其他线程的读 没有其他线程的写 到ReentrantReadWriteLock,首先要做的是与ReentrantLock划清界限。...然后就是总结这个机制的特性了: (a).重入方面其内部的WriteLock可以获取ReadLock,但是反过来ReadLock想要获得WriteLock则永远都不要想。

50510

浅谈Java中的:Synchronized、重入、读写

更多关于JMM的知识请参考此文章:Java线程内存模型 想要避免这种多线程并发操作引起的数据异常问题一个简单的解决方案就是加锁。JDK提供的synchronize就是一个很好的选择。...还没有优化synchronize之前还有一个比它表现的更为亮眼,这个就是重入。...在之前的文章:多线程基本概念 中有提到过因为线程优先级而导致的饥饿问题,重入提供了一种公平的功能,可以忽略线程的优先级,让所有线程公平竞争。...对于synchronize来说,如果一个线程获取资源的时候要么阻塞要么就是获取到资源,这样的情况是无法解决死锁问题的。而重入则可以响应中断,通过放弃资源而解决死锁问题。...,3个线程并发写的状况,如果我们使用synchronize或者重入的时候我想上方最后的耗时应该是26秒多。

44500

重入

使用Java进行多线程开发,使用是一个几乎不可避免的问题。今天,就让我们来聊一聊这个基础,但是又特别特别重要的话题。 首先,让我们来看一下,到底什么是? 以及,为什么要使用?...而读线程也是一样,先取得,再读,然后释放。这样就可以避免发生这种情况。 如下图所示: ? 什么是重入? 好了,现在大家知道我们为什么要使用了。那什么是重入呢。...所以,对于希望傻瓜式编程的我们来说,重入就是用来解决这个问题的。重入使得同一个线程可以对同一把,在不释放的前提下,反复加锁,而不会导致线程卡死。...Java中的重入 Java中的都来自与Lock接口,如下图中红框内的,就是重入。 ?...,所以我把他当做多线程系列的第一章节,对于重入,我们需要特别知道几点: 对于同一个线程重入允许你反复获得通一把,但是,申请和释放的次数必须一致。

44630

Java并发编程之重入(ReentrantLock)

* Thread-1释放了 * Thread-0获得了 * Thread-0释放了 */ 可重入性 可重入性是指线程获得之后,没有释放,当再次需要获得同一把的时候仍然可以成功。...如果是不可重入的,第二次获得的时候就会导致死锁。...如果state大于0,则判断持有线程是不是当前线程,如果是则需要更新重入次数,重新设置state的值后返回true,反之则表示已经被其他线程所持有,直接返回false。...; } 如果当前持有线程不是当前线程则直接抛出异常,否则继续判断state的值,如果state为0,则清空的持有线程,如果state不为0,则减少重入次数。...参考资料: 《Java并发编程之美》 一文彻底理解ReentrantLock可重入的使用

60120

重入和不可重入的区别

不可重入示例(同一个线程不可以重入上锁后的代码段) 如下是一个不可重入的逻辑过程,会发现执行main方法控制台会打印执行doJob方法前,然后就会一直线程阻塞,不会打印执行doJob方法过程中,原因在于第一次上锁后...,由于没有释放,因此执行第一次lock后isLocked = true,这个时候调用doJob()内部又一次调用了lock()由于上个线程将isLocked = true,导致再次进入的时候就进入死循环...这种现象就造成了不可重入 public class Count{ MyLock lock = new MyLock(); public static void main(String...notify(); // 接触阻塞 } } 可重入示例(同一个线程可以重入上锁的代码段,不同的线程则需要进行阻塞) java的可重入有:ReentrantLock...(显式的可重入)、synchronized(隐式的可重入) 可重入诞生的目的就是防止上面不可重入的那种情况,导致同一个线程不可重入上锁代码段。

44210

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

重入,实现了显式,意思就是可重入的显式(内置也是可重入的) 读写,将显式分为读写分离,即读读可并行,多个线程同时读不会阻塞(读写,写写还是串行) 下面让我们开始吧 文章如果有问题,欢迎大家批评指正...,在此谢过啦 目录 可重入 ReentrantLock 读写 ReadWriteLock 区别 正文 1.可重入 ReentrantLock 我们先来看下它的几个方法: public ReentrantLock...读写 ReadWriteLock 读写内部就两个方法,分别返回读和写属于共享,而写属于独占(前面介绍的可重入和内置也是独占) 读允许多个线程同时获取一个,因为读不会修改数据...=== 0 === 获取到 读 === 可以看到,两个线程都获取到了读,这就是读的优势,多个线程同时读 下面看下写,代码如下:(这里用到了ReentrantReadWriteLock类,表示可重入的读写...,则推荐用读写(成对的读和写需从同一个读写类获取) 参考内容: 《Java并发编程实战》 《实战Java高并发》 后记 最后,祝愿所有人都心想事成,阖家欢乐

51310
领券