首页 > 其他分享 >死锁和递归锁

死锁和递归锁

时间:2024-05-23 13:29:01浏览次数:13  
标签:name Thread self 递归 死锁 抢到

死锁和递归锁
【一】死锁
【1】介绍
死锁是指两个或多个进程,在执行过程中,因争夺资源而造成了互相等待的一种现象。
即两个或多个进程持有各自的锁并试图获取对方持有的锁,从而导致被阻塞,不能向前执行,最终形成僵局。
在这种情况下,系统资源利用率极低,系统处于一种死循环状态。
【2】例子
要吃饭,必须具备盘子和筷子
但是一个人拿着盘子等筷子。
另一个人拿着筷子等盘子
【3】解决办法
锁不要有多个,一个足够
如果真的发生了死锁的问题,必须迫使一方先交出锁
【4】示例
【二】递归锁
【1】介绍
递归锁(也叫可重入锁)是一种特殊的锁,它允许一个线程多次请求同一个锁,称为“递归地”请求锁
在该线程释放锁之前,会对锁计数器进行累加操作,线程每成功获得一次锁时,都要进行相应的解锁操作,直到锁计数器清零才能完全释放该锁。
递归锁能够保证同一线程在持有锁时能够再次获取该锁,而不被自己所持有的锁所阻塞,从而避免死锁的发生。
但是注意要正常使用递归锁,避免过多地获取锁导致性能下降。
【2】示例
可以被连续的 acquire 和 release
但是只能被第一个抢到这把锁上执行上述操作
他的内部有一个计数器,每acquire一次计数 +1 每release一次 计数-1
只要计数不为0,那么其他人都无法抢到该锁

from threading import Thread, Lock, RLock
import time

两个变量同时指向一把锁

metexA = metexB = RLock()

类只要加括号多次 产生的肯定不同的对象

如果你想要实现多次加括号等到的是相同的对象 - 单例模式

class MyThread(Thread):
def run(self):
self.func1()
self.func2()

def func1(self):
    metexA.acquire()
    # self.name:获取当前线程名
    print(f'{self.name} 抢到了A锁')
    metexB.acquire()
    print(f'{self.name} 抢到了B锁')
    metexB.release()
    metexA.release()

def func2(self):
    metexB.acquire()
    # self.name:获取当前线程名
    print(f'{self.name} 抢到了A锁')
    time.sleep(2)
    metexA.acquire()
    print(f'{self.name} 抢到了B锁')
    metexA.release()
    metexB.release()

def main():
for i in range(10):
t = MyThread()
t.start()

if name == 'main':
main()

# Thread-1 抢到了A锁
# Thread-1 抢到了B锁
# Thread-1 抢到了A锁
# Thread-1 抢到了B锁
# Thread-2 抢到了A锁
# Thread-2 抢到了B锁
# Thread-2 抢到了A锁
# Thread-2 抢到了B锁
# Thread-4 抢到了A锁
# Thread-4 抢到了B锁
# Thread-4 抢到了A锁
# 不会卡主正常进行

&一处繁华一页笺&昨天 11:3116IP 属地上海
举报
分享到:
注册 / 登录 语雀进行评论
语雀
关于语雀

标签:name,Thread,self,递归,死锁,抢到
From: https://www.cnblogs.com/zenopan101861/p/18208231

相关文章

  • 带你彻底搞懂递归时间复杂度的Master公式
    1.什么是Master公式1.1Master公式的定义Master公式,又称为Master定理或主定理,是分析递归算法时间复杂度的一种重要工具,尤其适用于具有分治结构的递归算法。\[T(n)=a*T(n/b)+O(n^d)\]Master公式本身就是递归的形式,是递归方法时间复杂度的一种表示法。T(n)代表递归方法处......
  • 代码随想录算法训练营第第14天 | 二叉树递归遍历(递归法、迭代、统一的迭代方法)
    递归遍历(必须掌握)二叉树的三种递归遍历掌握其规律后,其实很简单题目链接/文章讲解/视频讲解:https://programmercarl.com/二叉树的递归遍历.html迭代遍历(基础不好的录友,迭代法可以放过)题目链接/文章讲解/视频讲解:https://programmercarl.com/二叉树的迭代遍历.html统一迭代......
  • 递归地获取当前目录下所有文件的后缀名(不重复)
    好的,这里是修改后的批处理脚本,它将递归地获取当前目录下所有文件的后缀名,并将不重复的后缀名输出到当前目录下的a.txt文件中,然后结束:@echooffsetlocalenabledelayedexpansion::初始化一个空的集合用来存储后缀名set"suffixList="::递归遍历当前目录及其子目录下的所......
  • 在 JavaScript 中递归展开数组
    对嵌套数组使用递归:递归是处理嵌套数组的干净而有效的方法。它允许您处理任意深度的数组。使用该Array.isArray方法检查数组:这有助于确保代码适用于不同的数据类型并且更加健壮。 潜在性能问题:对大型数组要小心:处理非常深或很大的数组时,递归函数可能会导致堆栈溢出错误。在这......
  • 简单的加减乘除(递归)
    简单的加减乘除(递归)packagemethod;importjava.util.Scanner;publicclassTest{publicstaticvoidmain(String[]args){//简易的计算器Scannerscanner=newScanner(System.in);System.out.println("请输入第一个值:");doub......
  • 什么是递归?
    Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解`什么是递归?日期:2017-8-9阿珏谈天说地浏览:1616次评论:5条图片来源于网络一上来你肯定觉得读这句话好绕,好吃力。其实......
  • 二叉树 | 递归法 101.对称二叉树
    leetcode101.对称二叉树题目101.对称二叉树给你一个二叉树的根节点root,检查它是否轴对称。解题思路递归法,判断左节点的左孩子是否可以翻转成右节点的右孩子(左节点的左孩子==右节点的右孩子,左节点的右孩子==右节点的左孩子)递归三步骤:1、确定递归函数的入参和返回值......
  • 二叉树的递归遍历 144.二叉树的前序遍历 145.二叉树的后序遍历 94.二叉树的中序遍历
    leetcode144.二叉树的前序遍历题目xxx解题思路实现代码leetcode145.二叉树的后序遍历题目xxx解题思路实现代码leetcode94.二叉树的中序遍历题目xxx解题思路实现代码......
  • 在Linux中,如何排查死锁问题?
    在Linux中排查死锁问题通常涉及监控系统状态、分析进程行为和资源使用情况,以及使用特定的工具来辅助诊断。以下是一些常见的步骤和工具:1.观察系统状态使用top或htop:这些工具可以实时显示系统负载、CPU使用率、内存占用以及所有运行中的进程。死锁可能导致某些进程长时间不......
  • 92. 递归实现指数型枚举
    传送锚点:https://www.acwing.com/problem/content/94/从1∼n这n个整数中随机选取任意多个,输出所有可能的选择方案。输入格式输入一个整数n。输出格式每行输出一种方案。同一行内的数必须升序排列,相邻两个数用恰好1个空格隔开。对于没有选任何数的方案,输出空行。本......