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

Posted 传智教育官方博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java多线程:并发死锁问题分析资源限制的挑战相关的知识,希望对你有一定的参考价值。

学习目标:

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


一、聊聊并发编程

死锁问题

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

描述

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

在这里插入图片描述在这里插入图片描述

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

查看线程执行情况

执行:jps、jstack

在这里插入图片描述

如何避免死锁

常见方法:

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

小结

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

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

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

以上是关于Java多线程:并发死锁问题分析资源限制的挑战的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程视频教程并发编程面试知识

Java并发编程的挑战

JAVA并发编程艺术 一(并发编程的挑战)

《Java并发编程的艺术》读后笔记-part1

多线程上下文切换

Java从入门到精通!并发编程挑战:死锁与上下文切换