Java多线程:并发死锁问题分析资源限制的挑战
Posted 传智教育官方博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java多线程:并发死锁问题分析资源限制的挑战相关的知识,希望对你有一定的参考价值。
学习目标:
并发死锁问题分析、资源限制的挑战一、聊聊并发编程
死锁问题
并发编程的目的是为了让程序运行更快,但是并不是启动更多的线程就可以让程序最大限度地并发执行。在进行并发编程时,如果希望通过多线程执行任务让程序运行得更快,会面临非常多的挑战,比如上下文切换的问题、死锁的问题。
描述
锁是个非常有用的工具,运用场景非常多,因为它使用起来非常简单,易于理解。但是它会引起死锁,一旦发生死锁,就会造成系统功能不可用。
上面演示代码就是死锁的场景,在现实中我们写不出来这样的代码。但是在一些更为复杂场景中,可能会遇到这样的问题。比如t1拿到死锁之后,因为一些异常情况没有释放锁(死循环)。又或者是t1拿到一个数据库锁,释放锁的时候抛出了异常,没有释放掉。一旦出现死锁,业务是可感知的,因为不能再继续提供服务了。
查看线程执行情况
执行:jps、jstack
如何避免死锁
常见方法:
- 避免一个线程同时获取多个锁。
- 避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。
- 尝试使用定时锁,使用lock .tryLock(timeout )来替代使用内部锁机制。
- 对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。
小结
1.什么是死锁:多线程竞争共享资源,导致线程互相等待,程序无法执行
2.死锁的产生条件:
a.有多个线程
b.有多把锁
c.有同步代码块嵌套
3.如何避免死锁
干掉其中一个条件即可
lock.tryLock()
lock.lockInterruotibly();
ReentranReadwriteLock.ReaLock();
以上是关于Java多线程:并发死锁问题分析资源限制的挑战的主要内容,如果未能解决你的问题,请参考以下文章