美文网首页
线程 -- 死锁

线程 -- 死锁

作者: glRu | 来源:发表于2020-07-28 11:08 被阅读0次

死锁

在线程间共享多个资源的时候・如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。

尽管死锁很少发生,但一旦发生就会造成应用的停止响应。下面看一个死锁的例子

避免死锁

程序设计时尽量避免(比如:银行家算法)

添加超时时间

死锁的例子:

# 死锁: 一直等待对方释放锁的情景叫做死锁

import  threading

# 创建互斥锁

lock = threading.Lock()

# 需求: 多线程同时根据下标在列表中取值,要保证同一时刻只能有一个线程去取值

def  get_value(index):

    # 上锁

    lock.acquire()

    my_list = [1,4,6]

    # 判断下标是否越界

    if  index >= len(my_list):

        print("下标越界:", index)

        return

# 根据下标取值

value = my_list[index]

print(value)

# 释放锁

lock.release()

if__name__=='__main__':

# 创建大量线程,同时执行根据下标取值的任务

    for i in range(10):

        # 每循环一次创建一个子线程

        sub_thread = threading.Thread(target=get_value, args=(i,))

        # 启动线程执行任务

        sub_thread.start()

上面程勋运行发生了死锁,原因在于 return 执行后,标志着函数结束,但是锁没有被释放,但是你又创建了10个线程,那后面的线程就会一直等待释放锁,从而造成死锁,因此正确写法如下:

# 死锁: 一直等待对方释放锁的情景叫做死锁

import  threading

# 创建互斥锁

lock = threading.Lock()

# 需求: 多线程同时根据下标在列表中取值,要保证同一时刻只能有一个线程去取值

def  get_value(index):

    # 上锁

    lock.acquire()

    my_list = [1,4,6]

    # 判断下标是否越界

    if  index >= len(my_list):

        print("下标越界:", index)

        # 取值不成功,也需要释放互斥锁,不要影响后面的线程去取值

        # 锁需要在合适的地方进行释放,防止死锁

        lock.release()

        return

# 根据下标取值

value = my_list[index]

print(value)

# 释放锁

lock.release()

if__name__=='__main__':

# 创建大量线程,同时执行根据下标取值的任务

    for i in range(10):

        # 每循环一次创建一个子线程

        sub_thread = threading.Thread(target=get_value, args=(i,))

        # 启动线程执行任务

        sub_thread.start()

相关文章

  • JavaEE面试题总结 Day39 2018-12-29

    什么是线程死锁?死锁如何产生?如何避免线程死锁? 死锁的介绍: 线程死锁是指由于两个或者多个线程互相持有对方所需要...

  • Python中的各种锁

    Python之死锁 死锁分为两种情况,多进程/线程的死锁.或者是单线程的死锁. 1.首先看一下单线程的死锁,单线程...

  • 5. 死锁

    线程死锁 死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁。死锁通常发生在多个线程同时但以不同的顺序...

  • 死锁

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

  • 6. 使用synchronized实现死锁

    死锁定义 死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁。死锁通常发生在多个线程同时但以不同的顺序...

  • 面试官:连多线程问题你都一问三不知,还要我怎么“放水”?

    面试官:问你几个多线程相关的问题吧,说一下导致线程死锁的原因,怎么解除线程死锁? 程序员阿里:这个...死锁......

  • 十.Java并发编程的挑战

    1. 死锁 线程死锁 死锁是指两个或多个线程被阻塞等待获取某些其他线程所持有的锁。当多个线程同时需要相同的锁,但以...

  • Java多线程之死锁(Deadlock)及死锁避免(Deadlo

    线程死锁(Thread Deadlock) 数据库死锁(Database Deadlocks) 死锁避免 (Dea...

  • Java自学-多线程 死锁

    Java 演示多线程死锁 当业务比较复杂,多线程应用里有可能会发生死锁 步骤 1 : 演示死锁 线程1 首先占有对...

  • Synchronized关键字详解2(对非object持锁)

    4.死锁:同步方法容易造成死锁。Java线程死锁是一个经典的多线程问题,因为不同的线程都在等待根本不可能被释放的锁...

网友评论

      本文标题:线程 -- 死锁

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