0
点赞
收藏
分享

微信扫一扫

Java多线程:并发死锁问题分析、资源限制的挑战


学习目标:


并发死锁问题分析、资源限制的挑战

文章目录

  • ​​学习目标:​​
  • ​​一、聊聊并发编程​​
  • ​​死锁问题​​
  • ​​描述​​
  • ​​查看线程执行情况​​
  • ​​如何避免死锁​​
  • ​​小结​​

一、聊聊并发编程

死锁问题

并发编程的目的是为了让程序运行更快,但是并不是启动更多的线程就可以让程序最大限度地并发执行。在进行并发编程时,如果希望通过多线程执行任务让程序运行得更快,会面临非常多的挑战,比如上下文切换的问题、死锁的问题。

描述

锁是个非常有用的工具,运用场景非常多,因为它使用起来非常简单,易于理解。但是它会引起死锁,一旦发生死锁,就会造成系统功能不可用。

Java多线程:并发死锁问题分析、资源限制的挑战_java

Java多线程:并发死锁问题分析、资源限制的挑战_并发编程_02

上面演示代码就是死锁的场景,在现实中我们写不出来这样的代码。但是在一些更为复杂场景中,可能会遇到这样的问题。比如t1拿到死锁之后,因为一些异常情况没有释放锁(死循环)。又或者是t1拿到一个数据库锁,释放锁的时候抛出了异常,没有释放掉。一旦出现死锁,业务是可感知的,因为不能再继续提供服务了。

查看线程执行情况

执行:jps、jstack

Java多线程:并发死锁问题分析、资源限制的挑战_java_03

如何避免死锁

常见方法:

  1. 避免一个线程同时获取多个锁。
  2. 避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。
  3. 尝试使用定时锁,使用lock .tryLock(timeout )来替代使用内部锁机制。
  4. 对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。

小结

1.什么是死锁:多线程竞争共享资源,导致线程互相等待,程序无法执行

2.死锁的产生条件:
a.有多个线程
b.有多把锁
c.有同步代码块嵌套

3.如何避免死锁
干掉其中一个条件即可
lock.tryLock()
lock.lockInterruotibly();
ReentranReadwriteLock.ReaLock();


举报

相关推荐

0 条评论