美文网首页
死锁与递归锁

死锁与递归锁

作者: knot98 | 来源:发表于2018-09-07 15:04 被阅读0次

一 . 死锁

代码示例

from threading import Thread,Lock,RLock
import time

mutexA=Lock()
mutexB=Lock()
# mutexB=mutexA=RLock()


class Mythead(Thread):
    def run(self):
        self.f1()
        self.f2()

    def f1(self):
        mutexA.acquire()
        print('%s 抢到A锁' %self.name)
        mutexB.acquire()
        print('%s 抢到B锁' %self.name)
        mutexB.release()
        mutexA.release()

    def f2(self):
        mutexB.acquire()
        print('%s 抢到了B锁' %self.name)
        time.sleep(2)
        mutexA.acquire()
        print('%s 抢到了A锁' %self.name)
        mutexA.release()
        mutexB.release()

if __name__ == '__main__':
    for i in range(5):
        t=Mythead()
        t.start()

运行效果

Thread-1 抢到A锁
Thread-1 抢到B锁
Thread-1 抢到了B锁
Thread-2 抢到A锁

原因:
线程一手里拿着B锁的钥匙,但线程一想要继续执行代码必须要得到A锁的钥匙,
而 线程二手里拿着A锁的钥匙,想要继续执行代码却必须要得到B锁的钥匙.进而陷入了一个死结,即死锁

解决方法
就是尽量不自己进行加锁处理
如果必须使用锁,则可以用递归锁来解决

二. 递归锁

代码如下:

from threading import Thread,Lock,RLock
import time

# mutexA=Lock()
# mutexB=Lock()
mutexB=mutexA=RLock()


class Mythead(Thread):
    def run(self):
        self.f1()
        self.f2()

    def f1(self):
        mutexA.acquire()
        print('%s 抢到A锁' %self.name)
        mutexB.acquire()
        print('%s 抢到B锁' %self.name)
        mutexB.release()
        mutexA.release()

    def f2(self):
        mutexB.acquire()
        print('%s 抢到了B锁' %self.name)
        time.sleep(2)
        mutexA.acquire()
        print('%s 抢到了A锁' %self.name)
        mutexA.release()
        mutexB.release()

if __name__ == '__main__':
    for i in range(5):
        t=Mythead()
        t.start()

运行结果

Thread-1 抢到A锁
Thread-1 抢到B锁
Thread-1 抢到了B锁
Thread-1 抢到了A锁
Thread-2 抢到A锁
Thread-2 抢到B锁
Thread-2 抢到了B锁
Thread-2 抢到了A锁
Thread-4 抢到A锁
Thread-4 抢到B锁
Thread-4 抢到了B锁
Thread-4 抢到了A锁
Thread-3 抢到A锁
Thread-3 抢到B锁
Thread-3 抢到了B锁
Thread-3 抢到了A锁
Thread-5 抢到A锁
Thread-5 抢到B锁
Thread-5 抢到了B锁
Thread-5 抢到了A锁

Process finished with exit code 0

运行结果显示,在使用了递归锁的情况下代码完美运行,并没有阻塞现象产生

在我们进行开发的过程尽量避免自己进行加锁处理,这样可以减少很多bug的产生

相关文章

  • 死锁与递归锁

    一 . 死锁 代码示例 运行效果 原因:线程一手里拿着B锁的钥匙,但线程一想要继续执行代码必须要得到A锁的钥匙,而...

  • 线程锁

    @synchronized 是递归锁,类似NSRecursiveLock,递归调用不会引起死锁,而NSLock是非...

  • 递归锁 死锁。

    synchronizedstatic NSString* A = @"A";/** B锁 /static NSSt...

  • NSRecursiveLock递归锁

    递归锁,它允许同一线程多次加锁,而不会造成死锁。以下的代码如果用NSLock就会造成死锁: //普通线程锁NSLo...

  • python线程死锁与递归锁

    死锁现象 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作...

  • 线程锁学习笔记

    1.NSRecursiveLock 递归锁 递归锁可以被同一线程请求多次,而不会引起死锁(是指两个或两个以上的进程...

  • Python并发编程中关于死锁,递归锁,信号量的理解

    并发编程中关于死锁,递归锁,信号量的理解 1.死锁**** ​ 所谓死锁: 是指两个或两个以上的进程或线程在执行过...

  • 死锁

    线程饥饿死锁 锁顺序死锁 动态锁顺序死锁通过锁顺序来避免死锁 避免死锁

  • 知识点整理

    redis redis为什么高效,及应用场景 锁 死锁产生条件,及避免死锁 悲观锁与乐观锁 数据库 事务 事务特性...

  • 锁-Lock-04

    可重入锁广义上的可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁(前提得是...

网友评论

      本文标题:死锁与递归锁

      本文链接:https://www.haomeiwen.com/subject/ksscgftx.html