可重入函数是并发编程中必须要考虑的问题,否则代码就会有隐患,更糟糕的是这些隐患往往只能在特定场景下才能复现。...拓展: 一个函数所谓的可重入性,是在多线程的语境下的概念:一个函数如果同时被多条线程调用,他返回的结果都是严格一致的,那么该函数被称为“可重入”函数(reentrance funciton),否则被称为...“不可重入”函数。...二是因为函数内部调用了其他不可重入函数。 三是因为函数执行结果与某硬件设备相关。...从这点出发,如果你想要写一个线程安全的可重入函数的话,只要遵循以下原则就行了: A) 不使用任何静态数据,只使用局部变量或者堆内存。 B) 不调用上表中的任何非线程安全的不可重入函数。
可重入锁详解 概述 什么是 “可重入”,可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁。...例如 package com.test.reen; // 演示可重入锁是什么意思,可重入,就是可以重复获取相同的锁,synchronized和ReentrantLock都是可重入的 // 可重入降低了编程复杂性...package com.test.reen; import java.util.Random; import java.util.concurrent.locks.ReentrantLock; // 演示可重入锁是什么意思...} } finally { lock.unlock(); } } }).start(); } } 可以发现没发生死锁,可以多次获取相同的锁 可重入锁有
Java中的重入锁 Java中的锁都来自与Lock接口,如下图中红框内的,就是重入锁。 ?...重入锁的实现原理 重入锁内部实现的主要类如下图: ? 重入锁的核心功能委托给内部类Sync实现,并且根据是否是公平锁有FairSync和NonfairSync两种实现。这是一种典型的策略模式。...重入锁的使用示例 为了让大家更好的理解重入锁的使用方法。现在我们使用重入锁,实现一个简单的计数器。...try { return count; }finally { lock.unlock(); } } } 总结 可重入锁算是多线程的入门级别知识点...默认情况下,重入锁是非公平的,公平的重入锁性能差于非公平锁 重入锁的内部实现是基于CAS操作的。
如下图所示: 总结 可重入锁算是多线程的入门级别知识点,所以我把他当做多线程系列的第一章节,对于重入锁,我们需要特别知道几点: 对于同一个线程,重入锁允许你反复获得通一把锁...默认情况下,重入锁是非公平的,公平的重入锁性能差于非公平锁 重入锁的内部实现是基于CAS操作的。...重入锁的伴生对象Condition提供了await()和singal()的功能,可以用于线程间消息通信。
可重入分析 1. 什么是“可重入” 2. 可能出现重入问题的接口 2.1 单个网络调用 2.2 多段网络调用 2.3 有状态接口 3. 可重入保证的关键场景 4....什么是“可重入” 一般情况下,可重入指的是接口(函数)可以重复调用且不发生异常。 个人认为,与幂等相比,可重入是一个业务概念。...比如登录接口,第一次登录成功后进行重复登录,若返回“登录成功”此时是幂等的(也是可重入的),若返回“您已登录”此时是可重入的但非幂等。 个人觉得没必要纠结幂等与可重入的概念细节差异。...注:重入问题和不可重入问题和可重入问题,都是同一个问题,都是指:可能存在不可重入的情况,但是想要保证可重入。 2....必定可重入: 无数据变更(幂等接口)必定可重入 必定不可重入: 存在多段网络调用进行数据变更的接口,前段逻辑的返回值受数据变化影响,且该数据会被当前接口修改(重入时可能出现后段逻辑不可达的情况)
可重入锁又称之为递归锁,两者一样 ReentrantLock/Synchronjzed就是典型的可重入锁 概念 : 可重入锁指的是同一线程外层函数获得锁之后,内层递归函数仍然能获取该锁的代码,在同一个线程在外层方法获取锁的时候...证明synchronized是可重入锁 demo1 证明ReentrantLock是可重入锁 demo2证明ReentrantLock也是可重入锁 可重入锁优点:可避免死锁(不会出现外方法进入后调用一个锁方法
Linux下常见可重入函数: POSIX.1-20001标准规定,所有的标准库函数都必须是可重入函数,除了以下这些: 文章目录 可重入函数 不可重入函数的特点 如何写出可重入函数 上面是两张可重入函数的函数表...,那,什么是可重入函数呢?...可重入函数 可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源...,标准I/O库的很多实现都是以不可重入的方式使用全局的数据结构 (3)可重入体内使用了静态的数据结构 ---- 如何写出可重入函数 1.不在函数内部使用静态或全局变量 2.不返回静态或全局变量,所有数据都有函数的调用者提供...可重入函数在并行运行环境中非常重要,但是一般要为访问全局变量付出一些性能代价。 编写可重入函数时,若使用全局变量,则应通过关中断、信号量(即P、V操作)等手段对其加以保护。
最近正在阅读Java ReentrantLock源码,始终对可重入和不可重入概念理解不透彻,进行学习后记录在这里。...wait():阻塞当前线程 notify():唤起被wait()阻塞的线程 不可重入锁 所谓不可重入锁,即若当前线程执行某个方法已经获取了该锁,那么在方法中尝试再次获取锁时,就会获取不到被阻塞。...我们尝试设计一个不可重入锁: ? 使用该锁: ? 当前线程执行print()方法首先获取lock,接下来执行doAdd()方法就无法执行doAdd()中的逻辑,必须先释放锁。...这个例子很好的说明了不可重入锁。 可重入锁 接下来,我们设计一种可重入锁 ? 所谓可重入,意味着线程可以进入它已经拥有的锁的同步代码块儿。...可重入锁的概念和设计思想大体如此,Java中的可重入锁ReentrantLock设计思路也是这样
,这里直接导致嵌入式 linux 系统应用进程中的所有线程停掉,进而导致看门狗进程得不到喂狗,设备重启。...那什么是不可重入函数呢? 为什么中断处理函数不能直接调用不可重入函数? 怎样写可重入函数? 就以上三个问题展开小短文: 2 什么是不可重入函数?...可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入 OS 调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源...在多任务系统下,中断可能在任务执行的任何时间发生;如果一个函数的执行期间被中断后,到重新恢复到断点进行执行的过程中,函数所依赖的环境没有发生改变,那么这个函数就是可重入的,否则就不可重入。...4 如何写出可重入的函数? 在函数体内不访问那些全局变量; 如果必须访问全局变量,记住利用互斥信号量来保护全局变量。
所谓重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的。 synchronized 和 ReentrantLock 都是可重入锁。...可重入锁的意义在于防止死锁。 实现原理是通过为每个锁关联一个请求计数器和一个占有它的线程。...可重入锁: 接下来,我们设计一种可重入锁 public class Lock{ boolean isLocked = false; Thread lockedBy = null;...可重入锁的概念和设计思想大体如此,Java中的可重入锁ReentrantLock设计思路也是这样。 synchronized和ReentrantLock 都是可重入锁。...摘自:JAVA可重入锁与不可重入锁 和 Java不可重入锁和可重入锁理解 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/153277.html原文链接:https
所谓可重入是指一个可以被多个任务调用的过程,任务在 调用时不必担心数据是否会 出错。不可重入函数在实时系统设计中被视为不安全函数。...可重入函数可以被一个以上的任务调用,而不必担心数据被破坏。可重入函数任何时候都可以被中断,一段时间以后又可以运行,而相应的数据不会丢失。...可重入函数或者只使用局部变量,即保存在CPU寄存器中或堆栈中;或者使用全局变量,则要对全局变量予以保护。 说法2: 一个可重入的函数简单来说,就是:可以被中断的函数。...把一个不可重入函数变成可重入的唯一方法是用可重入规则来重写他。 其实很简单,只要遵守了几条很容易理解的规则,那么写出来的函数就是可重入的。 第一,不要使用全局变量。...把一个不可重入函数变成可重入的唯一方法是用可重入规则来重写他。 其实很简单,只要遵守了几条很容易理解的规则,那么写出来的函数就是可重入的。 第一,不要使用全局变量。
不可重入锁示例(同一个线程不可以重入上锁后的代码段) 如下是一个不可重入锁的逻辑过程,会发现执行main方法控制台会打印执行doJob方法前,然后就会一直线程阻塞,不会打印执行doJob方法过程中,原因在于第一次上锁后...isLocked = false; // 将这个值设置为false目的是释放锁 notify(); // 接触阻塞 } } 可重入锁示例...(同一个线程可以重入上锁的代码段,不同的线程则需要进行阻塞) java的可重入锁有:ReentrantLock(显式的可重入锁)、synchronized(隐式的可重入锁) 可重入锁诞生的目的就是防止上面不可重入锁的那种情况...,导致同一个线程不可重入上锁代码段。...设计可重入锁的示例代码 public class MyReentrantLock { boolean isLocked = false; // 默认没有上锁 Thread
最近正在阅读Java ReentrantLock源码,始终对可重入和不可重入概念理解不透彻,进行学习后记录在这里。...这个例子很好的说明了不可重入锁。...可重入锁 接下来,我们设计一种可重入锁 public class Lock{ boolean isLocked = false; Thread lockedBy = null;...= 0){ isLocked = false; notify(); } } } } 所谓可重入...可重入锁的概念和设计思想大体如此,Java中的可重入锁ReentrantLock设计思路也是这样 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/153238.html
综上所述的函数行为总结一个概念就是:在多次调用中(不管是否同时)行为变现一致的函数,被称为可重入函数,否则被称为不可重入函数。...POSIX.1-20001标准规定,所有的标准库函数都必须是可重入函数,除了以下这些: ?...二是因为函数内部调用了其他不可重入函数。 三是因为函数执行结果与某硬件设备相关。...从这点出发,如果你想要写一个线程安全的可重入函数的话,只要遵循以下原则就行了: A) 不使用任何静态(老不死)数据,只使用局部变量或者堆内存。 B) 不调用上表中的任何非线程安全的不可重入函数。...如果不能同时满足以上两个条件,可以使用信号量、互斥锁等机制来确保使用静态数据或者调用不可重入函数时的互斥效果。其实,这也是编写多线程程序必须要注意的地方啦!
这样的函数是不安全的函数,也叫不可重入函数。相反,肯定有一个安全的函数,这个安全的函数又叫可重入函数。那么什么是可重入函数呢?...所谓可重入是指一个可以被多个任务调用的过程,任务在调用时不必担心数据是否会出错。...可重入函数在并行运行环境中非常重要,但是一般要为访问全局变量付出一些性能代价。 编写可重入函数时,若使用全局变量,则应通过关中断、信号量(即P、V操作)等手段对其加以保护。...那么如下函数不具有可重入性。...保证函数的可重入性的方法: 1)在写函数时候尽量使用局部变量(例如寄存器、堆栈中的变量); 2)对于要使用的全局变量要加以保护(如采取关中断、信号量等互斥方法),这样构成的函数就一定是一个可重入的函数。
{ lock.lock(); this.count++; lock.unlock(); return count; } } 不可重入锁...可重入锁 设计如下: public class Lock{ boolean isLocked = false; Thread lockedBy = null; int lockedCount...){ isLocked = false; notify(); } } } } 相对来说,可重入就意味着...这就是可重入锁的特点。...java中常用的可重入锁 synchronized java.util.concurrent.locks.ReentrantLock AtomicIntegerFieldUpdater:原子更新整型的字段的更新器
可重入锁 可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁。 synchronized和ReentrantLock都是可重入的。...可重入锁的一个好处是可一定程度避免死锁。 methodA 调用 methodB,如果一个线程调用methodA 已经获取了锁再去调用 methodB 就不需要再次获取锁了,这就是可重入锁的特性。...如果不是可重入锁的话,mehtodB 可能不会被当前线程执行,从而可能造成死锁。...可重入锁和自旋锁的优缺点: 自旋锁的优点在于,因为自旋锁不会引起调用者睡眠,所以不会进行线程调度,CPU时间片轮转等耗时操作。所以如果能在很短的时间内获得锁,自旋锁的效率远高于互斥锁。
什么是可重入锁,什么是不可重入锁,它们是如何实现的?...定义 可重入锁:当线程获取某个锁后,还可以继续获取它,可以递归调用,而不会发生死锁; 不可重入锁:与可重入相反,获取锁后不能重复获取,否则会死锁(自己锁自己)。 不可重入锁 用代码说话。...可重入锁 不可重入锁扩展一下,增加一个计数器,同一个线程每次获取锁计数器加1,释放锁减1,为0时释放锁。...} /* 输出: main 获得了锁 main 再次获得了锁, count = 2 main 释放了锁,count = 1 main 释放了锁,count = 0 main 彻底释放了锁 */ 可重入锁...synchronized 没错,用于声明同步方法/代码块的synchronized关键字提供的也是一个可重入锁。
基本用法与synchronized相似,都具备可重入互斥的特性,但拥有更强大的且灵活的锁机制。...内部维护了一个Sync,它继承AQS,实现AQS提供的独占式的获取与释放同步资源的方法,提供了可重入的具体实现。...如果是自己,那么好办,重入呗,将state变为nextc【原先state + 传入的acquires】,返回true。这里要注意:nextc<0表示可重入次数溢出。...state与可重入:AQS的state为0表示当前锁空闲,大于0表示该锁已经被占用,某一时刻只有一个线程可以获取该锁。...可重入性是通过判断持锁线程是不是当前线程,如果是,state+1,释放锁时,state-1,为0时表示彻底释放。
在自旋分布式锁实现 中我们已经分析了ReentrantLock的自旋特性,现在我们来分析一下它的可重入特性。...可重入特性其实说白了就是当获得锁的线程解锁后,重新来获取锁的时候会判断自己以前是否获取过锁,如果获取过就无需竞争,直接获取。...compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread()); else //可重入的主入口
领取专属 10元无门槛券
手把手带您无忧上云