首页 > 其他分享 >线程死锁问题以及递归锁解法

线程死锁问题以及递归锁解法

时间:2023-03-12 14:33:33浏览次数:45  
标签:线程 Thread 递归 self 死锁 抢到 muteXB mutexA name

from threading import Thread, Lock, RLock
import time

mutexA = Lock()
muteXB = Lock()
'''
# 将上述的
mutexA = Lock()
mutexB = Lock()
# 换成
mutexA = mutexB = RLock() # 递归锁 可解决本例的死锁问题
'''


class MyThead(Thread): def run(self) -> None: self.func1() self.func2() def func1(self): mutexA.acquire() print('%s 抢到A锁'%self.name) # 获取当前线程名 muteXB.acquire() print('%s 抢到B锁'%self.name) muteXB.release() mutexA.release() def func2(self): muteXB.acquire() print('%s 抢到B锁' % self.name) time.sleep(2) mutexA.acquire() print('%s 抢到A锁' % self.name) mutexA.release() muteXB.release() ''' Thread-1 抢到A锁 Thread-1 抢到B锁 Thread-1 抢到B锁 Thread-2 抢到A锁 线程1接下来要抢A锁,但A锁在线程2那里 线程2接下来要抢B锁,但B锁在线程1那里 形成死锁 ''' if __name__ == '__main__': for i in range(10): t = MyThead() t.start()

 

标签:线程,Thread,递归,self,死锁,抢到,muteXB,mutexA,name
From: https://www.cnblogs.com/palx/p/17208113.html

相关文章

  • Oracle with的重复使用(递归)
    Oraclewith的重复使用(递归)写力扣的时候学到了新的方法RecursiveWITHClauses通常来说如果直接使用withXXXas()这种,是没发直接使用自身的数据的例如/*Writeyour......
  • Jmeter右上角不显示线程数和运行时间
    问题:Jmeter右上角不显示线程数和运行时间问题发生原因在GUI界面去修改的语言这样就会出现这样的bug解决恢复原设置后去Jmeter的bin目录,找到jmeter.properties,把la......
  • 多线程实现方式2:实现Runnable接口
    publicclassMyRunnableimplementsRunnable{@Overridepublicvoidrun(){for(inti=0;i<100;i++){System.out.println("ru......
  • 系统架构设计师考试知识点整理-4:死锁问题、银行家算法、管程与线程
    死锁问题1.死锁是指多个进程之间相互等待对方的资源,而在得到对方资源之前又不释放自己的资源所造成的循环等待的现象。2.死锁产生的根本原因在于系统提供的资源少于并发进程......
  • Java 基础 - 线程的全部方法,线程池的使用
    1.线程的全部方法静态方法:staticThreadcurrentThread():返回当前线程staticvoidyield():把当前线程的执行权让给优先级更高或相对的线程staticvoidsleep(longmill......
  • 避免死锁(银行家算法)
    避免死锁(银行家算法)1、什么是安全序列2、安全序列、不安全状态、死锁的联系3、银行家算法实现思想知识回顾......
  • 汉诺塔问题——分而治之(引入递归,解决重复子问题)
    汉诺塔问题的引入:相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如图......
  • 线程六种状态
    线程六种状态 1.new状态线程创建,还没有执行2.runnable状态线程正常执行3.teminated状态线程终止4.block状态阻塞状态,例如等待锁释放5.timed_waiting状态有时......
  • 一次死锁经历
    加入CountDownLatch后死锁了描述:打开某个界面后,就会A类的start方法,show方法中调用了B类的get方法,并用synchronized包裹,而在B类方法中使用了线程池来调用A类的showData方法......
  • Java基础之并发——线程的生命周期和状态
    Java线程在运行的生命周期中的指定时刻只可能处于下面6种不同状态的其中一个状态:NEW:初始状态,线程被创建出来但没有被调用start()。RUNNABLE:运行状态,线程被调用......