开发者社区> 问答> 正文

锁未释放导致线程挂起

线程http-nio-11307-exec-287锁住了0x00000000a5d5fd30,导致很多线程被阻塞,同时这个线程再等待锁“0x00000000a6af3a38”,奇怪的是,没有其他线程占用这个锁。一头雾水。

jstack输出在这里:jstack.txt

原提问者GitHub用户weiwei5297

展开
收起
山海行 2023-07-05 21:32:34 48 0
4 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    在多线程环境中,如果一个线程获取了锁但未释放,那么其他线程可能会因为无法获得锁而挂起。这种情况被称为“死锁”,可能会导致应用程序出现性能问题,或者最终导致应用程序崩溃。

    以下是一些可能导致锁未释放导致线程挂起的原因和解决方法:

    锁竞争
    如果多个线程同时竞争同一个锁,并且其中一个线程未能正确释放锁,那么其他线程可能会因为无法获得锁而挂起。在编写多线程程序时,需要考虑锁的使用方式和粒度,以避免锁竞争问题的发生。

    资源竞争
    如果多个线程竞争相同的资源,并且其中一个线程未能正确释放该资源,那么其他线程可能会因为无法获得该资源而挂起。在编写多线程程序时,需要考虑资源的互斥访问问题,以避免资源竞争问题的发生。

    死循环
    如果一个线程进入了死循环,可能会导致其他线程因为无法获得锁而挂起。在编写多线程程序时,需要考虑线程的控制流程,避免出现死循环的情况。

    2023-07-30 09:36:42
    赞同 展开评论 打赏
  • 值得去的地方都没有捷径

    根据您提供的信息和jstack输出,问题似乎是由于线程http-nio-11307-exec-287锁住了某个对象,但该对象的锁未被释放,导致其他线程被阻塞。同时,该线程还在等待另一个锁。

    在分析jstack输出之前,我需要了解一些附加信息:

    1. 您是否可以提供相关的源代码片段,特别是涉及到锁的部分?
    2. 您是否可以提供更多的线程堆栈跟踪信息,特别是与锁相关的线程堆栈?

    这些信息将有助于更好地理解问题并提供更准确的建议。

    2023-07-11 19:15:27
    赞同 展开评论 打赏
  • 在这种情况下,可以尝试使用其他的锁实现方式来实现线程同步,或者使用其他的Java程序优化技术来优化Java程序的性能。

    2023-07-11 10:33:12
    赞同 展开评论 打赏
  • 找到问题了。由于使用了spirng事务,被阻塞的线程把数据库连接用光了,而http-nio-11307-exec-287这个线程此时正好要去获取一个新连接,然而数据库连接数已经达到“最大连接数”,所以只能等待,然后死锁出来了。。。

    原回答者GitHub用户weiwei5297

    2023-07-06 12:14:17
    赞同 展开评论 打赏
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
多IO线程优化版 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载