美文网首页
三.并发理论总结3-规避死锁

三.并发理论总结3-规避死锁

作者: 乙腾 | 来源:发表于2020-10-07 19:22 被阅读0次

死锁的理论基础

什么是死锁?

一组互相竞争资源的线程因互相等待,导致“永久”阻塞的现象。

一个形象的例子

比如古代转账都需要那自己的账本和别人的账本自己的减少,别人的增加,当A,B两个用户彼此同时互相转账时,两者的柜员都先拿走其对应客户A/B自己的账本,在进行转账,去拿被转入账户的账本时,发现对方账本都被各自对应的柜员拿走了,那么两个柜员都等待各自转账的账本被归还才能进行转账,从而进入了无限等待状态。

触发死锁的四个条件(来自外国一个叫考夫曼的家伙)

  1. 互斥,共享资源 X 和 Y 只能被一个线程占用;
  2. 占有且等待,线程 T1 已经取得共享资源 X,在等待共享资源 Y 的时候,不释放共享资源 X;
  3. 不可抢占,其他线程不能强行抢占线程 T1 占有的资源;
  4. 循环等待,线程 T1 等待线程 T2 占有的资源,线程 T2 等待线程 T1 占有的资源,就是循环等待。

规避死锁的方案

通过触发死锁的四个条件来提出解决方案,按照这四个触发条件来破题。

1.互斥

共享资源X和Y只在一个线程中使用。

2.占有且等待

等待通知机制

用 synchronized 实现等待 - 通知机制

死锁的理论基础

什么是死锁?

一组互相竞争资源的线程因互相等待,导致“永久”阻塞的现象。

一个形象的例子

比如古代转账都需要那自己的账本和别人的账本自己的减少,别人的增加,当A,B两个用户彼此同时互相转账时,两者的柜员都先拿走其对应客户A/B自己的账本,在进行转账,去拿被转入账户的账本时,发现对方账本都被各自对应的柜员拿走了,那么两个柜员都等待各自转账的账本被归还才能进行转账,从而进入了无限等待状态。

触发死锁的四个条件(来自外国一个叫考夫曼的家伙)

  1. 互斥,共享资源 X 和 Y 只能被一个线程占用;
  2. 占有且等待,线程 T1 已经取得共享资源 X,在等待共享资源 Y 的时候,不释放共享资源 X;
  3. 不可抢占,其他线程不能强行抢占线程 T1 占有的资源;
  4. 循环等待,线程 T1 等待线程 T2 占有的资源,线程 T2 等待线程 T1 占有的资源,就是循环等待。

规避死锁的方案

通过触发死锁的四个条件来提出解决方案,按照这四个触发条件来破题。

1.互斥

共享资源X和Y只在一个线程中使用。

2.占有且等待

等待通知机制

用 synchronized 实现等待 - 通知机制

image.png

这个等待队列和互斥锁是一对一的关系,每个互斥锁都有自己独立的等待队列。

组合

wait()、notify()和notifyAll()

用lock实现等待 - 通知机制

组合

lock,await,signalAll

3.不可抢占

终止线程,interuptNow

4.循环等待

可以靠按序申请资源来预防。所谓按序申请,是指资源是有线性顺序的,申请的时候可以先申请资源序号小的,再申请资源序号大的,这样线性化后自然就不存在循环了。

notice:

                    按照某个序号申请,那么也就可以让一组互相竞争资源的线程,同时都拿一把锁对象,那么后拿到的就进入阻塞状态,直到锁对象资源被释放。

这个等待队列和互斥锁是一对一的关系,每个互斥锁都有自己独立的等待队列。

组合

wait()、notify()和notifyAll()

用lock实现等待 - 通知机制

组合

lock,await,signalAll

3.不可抢占

终止线程,interuptNow

4.循环等待

可以靠按序申请资源来预防。所谓按序申请,是指资源是有线性顺序的,申请的时候可以先申请资源序号小的,再申请资源序号大的,这样线性化后自然就不存在循环了。

notice:

                    按照某个序号申请,那么也就可以让一组互相竞争资源的线程,同时都拿一把锁对象,那么后拿到的就进入阻塞状态,直到锁对象资源被释放。

相关文章

  • 三.并发理论总结3-规避死锁

    死锁的理论基础 什么是死锁? 一组互相竞争资源的线程因互相等待,导致“永久”阻塞的现象。 一个形象的例子 比如古代...

  • Java高并发 -- 并发扩展

    Java高并发 -- 并发扩展 主要是学习慕课网实战视频《Java并发编程入门与高并发面试》的笔记 死锁 死锁是指...

  • GCD 死锁

    GCD死锁 同步 异步 串行 并发

  • Java Concurrent 死锁

    前言 死锁是一个比较大的概念,在并发场景下的加锁行为都有可能产生死锁问题。在Java 并发编程中会有死锁,操作系统...

  • 多线程相关之GCD、死锁、dispatch_barrier_as

    推荐阅读:备战2020——iOS全新面试题总结 GCD---同步/异步 ,串行/并发 死锁 GCD任务执行顺序 d...

  • Mysql学习(六) 行锁

    行锁、死锁、死锁监测 两阶段协议锁,如何安排正确的事务语句,可能影响并发度的锁尽量往后放 死锁和死锁监测,如何减少...

  • 操作系统(二)进程管理 2.4 死锁

    2.4 死锁 2.4.1 死锁的概念 2.4.1.1 死锁的定义 在并发环境下,各进程因竞争资源而造成的一种互相等...

  • 适当选择

    有效的 复制 总结并发扬 无效的 规避 小心并远离 适当灰度妥协 不抱怨 少解释 多调查 勤思考 贵实践

  • 并发编程情况下几个相应问题简介

    1.并发编程的挑战之死锁 ​ 死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁。死锁通常发生在多...

  • 《JAVA并发编程的艺术》要点(一)并发编程的挑战

    并发编程的目的是为了让程序运行的更快 并发编程面临的挑战 一、上下文切换问题 二、死锁问题 三、资源受限问题 (一...

网友评论

      本文标题:三.并发理论总结3-规避死锁

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