养生 装修 购物 美食 感冒 便秘 营销 加盟 小吃 火锅 管理 创业 搭配 减肥 培训 旅游

避免死锁的方法有哪些

时间:2024-10-18 08:20:26

多线程编程中共享资源通常都会有多线程访问的问题,为了防止多个线程同时访问同一个资源导致资源状态不一致,通常都会使用加锁操作,加锁过程中就容易出现线程互相等待对方释放资源导致程序无法正常运行,本文就简单介绍常见的死锁避免方法。

工具/原料

高级编程语言

方法/步骤

1、死锁的出现有四个必要条件:资源互斥使用,也就是说每个资源一次只能有一个线程使用;占有并请求,所有的线程都持有它们目前请求到的资源并且申请还未得到的资源;不可剥夺,也就是说所有线程请求到的资源都无法被其他线程抢占;循环等待,也就是线程之间互相等待对方释放己方需要的资源

避免死锁的方法有哪些

2、如图所示的Java死锁案例,lock1和lock2所对象可以视作资源,两个线程都需要获取到lock1和lock2才能继续执行,由于再执行时第一个线程获取到了lock1的锁,第二个线程获取到了lock2的锁对象,继续执行两个线程它们无法获得新的锁对象,导致程序无法继续运行

避免死锁的方法有哪些

3、执行Windows+R打开运行对话框输入cmd,再命令行中执行jps查看当前系统中的Java进程,找到Deadlock对应的进程ID,执行jstack进程ID,查看当前的执行线程堆栈,可以看到连个线程都被卡死在所对象上

避免死锁的方法有哪些

4、从死锁的必要条件可以看出死锁很重要的一点就是资源有限,每个线程执行都需要完全占有它需要的资源,可以通过增加资源来避免死锁

避免死锁的方法有哪些

5、如果资源昂贵,增加资源并不现实,此时可艮劁飨戽以规定资源的申请顺序,比如所有线程申请资源时必须按照R1->R2顺序申请,只有请求到R1资源才可以申请R2资源,当有一个线程申请瘌豚胛瑗到R1,其他线程都不能申请R2,此时第一个线程就能够执行完成,等它执行完成后释放资源,其他线程依然按照R1->R2的顺序申请资源,也就不会有死锁问题了

避免死锁的方法有哪些

6、现在修改死锁示例的所对象请求方式,要求两个线程都必须先申请lock1,再申请lock2,执行示例Demo,能够正常执行完成,不会出现死锁问题

避免死锁的方法有哪些

避免死锁的方法有哪些

7、申请的资闫龇疮傣源可以被撤销,比如第一个线程申请到R1再申请R2时发现第二个线程占据了R2并且在申请R1,此时第一个线程放弃R1并且等待随机时间准备第二次申请R1和R2,溟猫钽吟第二个线程放弃R2并且等待随机时间申请R1和R2,不断地等待重试多次总会有某个线程申请到了所有资源执行,等到它执行完成释放资源另外一个线程也就能够执行。

避免死锁的方法有哪些

8、Java中的synchronized锁无法被释放,可以捂执涡扔使用ReentrantLock可重入锁来实现锁机制,这里去掉了那些try..finally代码,两个线程在执行时如果在tryLock新的所醑穿哩侬对象失败,就释放自己原有的锁对象,并且等待一段时间,接着再重新执行锁请求,执行完成后线程退出循环,运行Demo能够正常执行完成

避免死锁的方法有哪些

避免死锁的方法有哪些

© 一点知识