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

学习目标:

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


一、聊聊并发编程

死锁问题

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

描述

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

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

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

查看线程执行情况

执行:jps、jstack

在这里插入图片描述

如何避免死锁

常见方法:

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

小结

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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值