zoukankan      html  css  js  c++  java
  • 线程死锁问题

    定义

    线程死锁就是有两个线程,一个线程锁住了资源A,又想去锁定资源B,另外一个线程锁定了资源B,又想去锁定资源A,两个线程都想去得到对方的资源,而又不愿释放自己的资源从而造成一种互相等待,无法执行的情况

    现象

    1、出现死锁后,tps降为0,压力测试工具无法得到服务器的响应,服务器硬件资源空闲,
    2、通过jvisualvm去查看线程情况,至少两个线程一直处于红色的阻塞状态
    3、死锁经常表现为程序的停顿,或者不再响应用户的请求。从操作系统上观察,对应进程的CPU占用率为零。

    image

    定位方法(一下两种方式均得到相同的结果)

    1、通过 jvisualvm 进行线程 dump ,对线程状态进行分析,获取到哪行代码导致的死锁
    2、通过 jstack pid > jh.log 进行线程 dump 并保存信息到当前目录的 jh.log文件中 ,对线程状态进行分析,获取到哪行代码导致的死锁

    一个Block的线程已经锁了 <0x00000000f0fadbd8> 这个资源,等待锁定 <0x00000000f0fadbe8>

    "http-nio-8080-exec-9" #34 daemon prio=5 os_prio=0 tid=0x000002d255f58800 nid=0x3dfc waiting for monitor entry [0x000000e52857d000]
       java.lang.Thread.State: BLOCKED (on object monitor)
    	at cn.testfan.perf.beihe.pinter.http.CaseController.dead(CaseController.java:81)
    	- waiting to lock <0x00000000f0fadbe8> (a java.lang.Object)
    	- locked <0x00000000f0fadbd8> (a java.lang.Object)
    	at sun.reflect.GeneratedMethodAccessor132.invoke(Unknown Source)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
    

    另一个Block的线程已经锁了 <0x00000000f0fadbe8> 这个资源,等待锁定 <0x00000000f0fadbd8>

    "http-nio-8080-exec-1" #26 daemon prio=5 os_prio=0 tid=0x000002d255f5c000 nid=0x30a8 waiting for monitor entry [0x000000e52817c000]
       java.lang.Thread.State: BLOCKED (on object monitor)
    	at cn.testfan.perf.beihe.pinter.http.CaseController.dead(CaseController.java:81)
    	- waiting to lock <0x00000000f0fadbd8> (a java.lang.Object)
    	- locked <0x00000000f0fadbe8> (a java.lang.Object)
    	at sun.reflect.GeneratedMethodAccessor132.invoke(Unknown Source)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
    

    解决思路

    ◼ 避免嵌套加锁
    ◼ 减小锁粒度

  • 相关阅读:
    ARM汇编初探---汇编代码中都有哪几类指令---ARM伪指令介绍
    RPC与REST的差别
    mahout源码KMeansDriver分析之五CIMapper
    cakephp , the subquery
    我也谈 javascript 模块化 -AMD规范
    TCP/IP Protocol Fundamentals Explained with a Diagram
    js 中ajax请求时设置 http请求头中的x-requestd-with= ajax
    理解用requireJs 来实现javascript的模块化加载
    javascript 中 apply(或call)方法的用途----对象的继承
    javascript 中{}和[] 的理解
  • 原文地址:https://www.cnblogs.com/DeryKong/p/15623679.html
Copyright © 2011-2022 走看看