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

Java不可重入锁和可重入锁理解

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

1.8K11

java可重入锁与不可重入

所谓重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的。 synchronized 和 ReentrantLock 都是可重入锁。...methodA1同步方法,如果其他线程没有获取A类的对象锁,那么当前线程就获得当前A类对象的锁,然后执行methodA1同步方法,方法体中调用methodA2同步方法,当前线程能够再次获取A类对象的锁,而其他线程是不可以的...代码演示: 不可重入锁: public class Lock{ private boolean isLocked = false; public synchronized void lock...这个例子很好的说明了不可重入锁。...摘自:JAVA可重入锁与不可重入锁 和 Java不可重入锁和可重入锁理解 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/153277.html原文链接:https

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

重入锁和不可重入锁的区别

不可重入锁示例(同一个线程不可重入上锁后的代码段) 如下是一个不可重入锁的逻辑过程,会发现执行main方法控制台会打印执行doJob方法前,然后就会一直线程阻塞,不会打印执行doJob方法过程中,原因在于第一次上锁后...这种现象就造成了不可重入锁 public class Count{ MyLock lock = new MyLock(); public static void main(String...(同一个线程可以重入上锁的代码段,不同的线程则需要进行阻塞) java的可重入锁有:ReentrantLock(显式的可重入锁)、synchronized(隐式的可重入锁) 可重入锁诞生的目的就是防止上面不可重入锁的那种情况...,导致同一个线程不可重入上锁代码段。...设计可重入锁的示例代码 public class MyReentrantLock { boolean isLocked = false; // 默认没有上锁 Thread

43210

C语言可重入函数和不可重入函数

这类函数我们称为不可重入函数。   ...如果是在函数体内 动态申请内存的话,即便 新的线程调用这个函数也没事,因为新的线程使用的是新的函数的 新申请的动态内存(静态变量只有一份,所以 多线程对于函数体内的静态变量改变 会有无法修复的结果),所以这类函数就是可重入函数...如果这个函数不幸被设计成为不可重入的函数的话,那么不同任务调用这个函数时 可能修改其他任 务调用这个函数的数据,从而导致不可预料的后果。那么什么是可重入函数呢?...所谓可重入是指一个可以被多个任务调用的过程,任务在 调用时不必担心数据是否会 出错。不可重入函数在实时系统设计中被视为不安全函数。...把一个不可重入函数变成可重入的唯一方法是用可重入规则来重写他。 其实很简单,只要遵守了几条很容易理解的规则,那么写出来的函数就是可重入的。 第一,不要使用全局变量。

3.3K30

Java不可重入锁和可重入锁理解

最近正在阅读Java ReentrantLock源码,始终对可重入不可重入概念理解不透彻,进行学习后记录在这里。...基础知识 Java多线程的wait()方法和notify()方法 这两个方法是成对出现和使用的,要执行这两个方法,有一个前提就是,当前线程必须获其对象的monitor(俗称“锁”),否则会抛出IllegalMonitorStateException...wait():阻塞当前线程 notify():唤起被wait()阻塞的线程 不可重入锁 所谓不可重入锁,即若当前线程执行某个方法已经获取了该锁,那么在方法中尝试再次获取锁时,就会获取不到被阻塞。...我们尝试设计一个不可重入锁: public class Lock{ private boolean isLocked = false; public synchronized void...这个例子很好的说明了不可重入锁。

33210

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

什么是可重入锁,什么是不可重入锁,它们是如何实现的?...定义 可重入锁:当线程获取某个锁后,还可以继续获取它,可以递归调用,而不会发生死锁; 不可重入锁:与可重入相反,获取锁后不能重复获取,否则会死锁(自己锁自己)。 不可重入锁 用代码说话。...基于 wait/notify 实现不可重入锁 import java.util.concurrent.locks.ReentrantLock; /** * 不可重入锁 */ public class...基于自旋锁实现不可重入锁 自旋锁,即获取锁的线程在锁被占用时,不是阻塞,而是不断循环去尝试,直到获取锁。...可重入不可重入锁扩展一下,增加一个计数器,同一个线程每次获取锁计数器加1,释放锁减1,为0时释放锁。

2.7K41

c语言可重入函数_c语言不可重入函数有哪些

什么是可重入函数 可重入函数指一个可同时被多个任务调用的过程,当一个函数满足下列条件时多为不可重入函数 (1)函数中使用了静态的数据结构; (2)函数中使用了malloc()、free()函数; (3...(如open、read、write、close等系统调用) 如何编写可重入函数 (1)编写可重入函数时,不应使用static局部变量,应使用auto即缺省态局部变量或寄存器变量。...不可重入函数示例: //Num为int型全局变量,函数Inc_Num返回Num加1的值 unsigned int example(int value) { unsigned int tmp;...Num = value; tmp = Inc_Num(); return tmp; } 可重入示例: //Num为int型全局变量,函数Inc_Num返回Num加1的值 unsigned

79040

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

首先我们要明白锁的概念,在多线程的场景下,不同的线程一起运行会导致脏数据,为了保证线程安全,这时候便出现了锁的概念,锁可以对代码块,资源,对象上锁,上锁之后,只允许一个线程对其进行操作,其他线程都会进入阻塞状态...之前文章重点单独介绍过Synchronized和Reentrantlock,不明白的同学可以先看看了解: currentHashMap的公平锁,可中断响应,限制等待实例 这篇文章主要是介绍可重入锁和不可重入锁...可重入锁可以理解为:同一个线程下,外层方法上锁之后,内层调用的方法也能正常获取锁。 下面先用代码介绍对【不可重入锁】的理解。...这就是不可重入锁。 可重入锁是什么呢?...我们自己可以用synchronized + wait + notify来实现不可重入锁,代码如下:

52220

Java多线程重入

什么是锁 简单来说,锁就是用来控制多线程情况下的访问行为,可以理解为一种许可,获得许可才允许执行。...什么是重入锁 ReentrantLock是实现Lock接口的一个类,支持重入性。线程在被两次lock加锁后会被阻塞,在复杂的调用场景中为了避免这种情况,于是就有了可重入锁。...使用condition condition是重入锁的伴生对象。它提供了在重入锁的基础上,进行等待和通知的机制。...这个计数器可以保证在多线程环境中,统计数据的精确性,请看下面示例代码: public class Counter { //重入锁 private final Lock lock = new...对于同一个线程,重入锁允许你反复获得一把锁,但是,申请和释放锁的次数必须一致。 默认情况下,重入锁是非公平的,公平的重入锁性能差于非公平锁 重入锁的内部实现是基于CAS操作的。

56320

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

在Java多线程编程中,锁是一项关键的技术,用于保护共享资源,确保线程安全。...ReentrantLock的基本概念ReentrantLock是Java.util.concurrent包中的一部分,是一种可重入的独占锁。可重入意味着同一个线程可以多次获取同一把锁而不会造成死锁。...2.3 可重入性ReentrantLock支持可重入性,同一线程可以多次获取锁,每次获取都必须有对应的释放操作。这使得线程可以嵌套地使用锁,而不会出现死锁。3....结语ReentrantLock是Java多线程编程中非常强大的锁机制,它提供了可重入性、公平性、条件变量等丰富的特性,适用于各种复杂的同步需求。...同时,多线程编程需要谨慎,合理地设计同步策略,以避免死锁和性能问题。希望本文能够帮助您更好地理解和使用ReentrantLock,使您的多线程编程之路更加顺畅。

23550

Linux并发(函数的可重入性)

拓展: 一个函数所谓的可重入性,是在多线程的语境下的概念:一个函数如果同时被多条线程调用,他返回的结果都是严格一致的,那么该函数被称为“可重入”函数(reentrance funciton),否则被称为...“不可重入”函数。...二是因为函数内部调用了其他不可重入函数。 三是因为函数执行结果与某硬件设备相关。...从这点出发,如果你想要写一个线程安全的可重入函数的话,只要遵循以下原则就行了: A) 不使用任何静态数据,只使用局部变量或者堆内存。 B) 不调用上表中的任何非线程安全的不可重入函数。...如果不能同时满足以上两个条件,可以使用信号量、互斥锁等机制来确保使用静态数据或者调用不可重入函数时的互斥效果。这是编写多线程程序必须要注意的地方。

1.3K40

Linux多线程

线程是进程内部的一个执行流,在Linux下并没有为线程额外创建数据结构来管理,而是通过只建立PCB来模拟实现的;但是在Windows下为了管理线程又创建了TCB内核数据结构来管理; Linux这种方式一方面是提高了代码的复用率...,一个进程内可能有多个线程,这些线程共享大部分的资源(这些资源都是来自进程的) 当有了多线程的概念以后,PCB就不是进程的专属内核数据结构了;当然CPU也无法区分这个PCB到底代表是进程还是线程...2、健壮性(鲁棒性)降低 ​ 编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。...4、编程难度提高 ​ 编写与调试一个多线程程序比单线程程序困难得多。...return 0; } ---- 2.线程等待 线程被创建出来也是帮我们执行任务的,它需要占用进程的资源,所以在线程结束时虽然可以不用关心它的退出信息,但还是要回收线程的资源的;不过线程回收的过程不可

15530

多线程----Immutable VS Mutable (可变与不可变)

在JDK中有很多的类被设计成不可变的,举个大家经常用到的类java.lang.String,String类被设计成不可变。String所表示的字符串的内容绝对不会发生变化。...因此,在多线程的情况下,String类无需进行互斥处理,不用给方法进行synchronized或者lock等操作,进行上锁、争抢锁、解锁等流程也是有一定性能损耗的。...为什么String不可变?     那么为什么String是不可变的呢?满足那些条件才可以变成不可变的类?...在一个类中使用了其他的类,其他的类是可变的 当一个不可变的类中使用了其他的可变类之后,那么受影响不可变的类也会变成可变的类。...,那么是否真的不可变呢?

58230

Linux多线程编程(不限Linux

还有多线程编程的一些细节问题,如线程之间怎样同步、互斥,这些东西将在本文中介绍。我见到这样一道面试题:   是否熟悉POSIX多线程编程技术?...(下面的内容摘自Linux下的多线程编程)   使用多线程的理由之一是和进程相比,它是一种非常"节俭"的多任务操作方式。...我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。...当然,数据的共享也带来其他一些问题,有的变量不能同时被两个线程所修改,有的子程序中声明为static的数据更有可能给多线程程序带来灾难性的打击,这些正是编写多线程程序时最需要注意的地方。   ...除了以上所说的优点外,不和进程比较,多线程程序作为一种多任务、并发的工作方式,当然有以下的优点:   提高应用程序响应。

4.3K20
领券