java死锁与死循环

什么是死锁?

死锁是两个或多个进程(可能为线程)相互竞争资源,资源不释放,造成相互等待的现象。

jvm如何定位死锁

  • 这里有多种方法,可以用jconsole查看当前进程内是否出现死锁
    java死锁与死循环_第1张图片
  • 另外也可以利用jps查看对应的进程id,然后通过jstack -pid来查看,下面就是jstack打印出来的堆栈信息的一部分。
Found one Java-level deadlock:
=============================
"Thread-1":
  waiting to lock monitor 0x00007fa7d580aab8 (object 0x0000000795796f90, a java.lang.Object),
  which is held by "Thread-0"
"Thread-0":
  waiting to lock monitor 0x00007fa7d580d558 (object 0x0000000795796fa0, a java.lang.Object),
  which is held by "Thread-1"

Java stack information for the threads listed above:
===================================================
"Thread-1":
    at DeadLock.DeadLock.m(DeadLock.java:39)
    - waiting to lock <0x0000000795796f90> (a java.lang.Object)
    - locked <0x0000000795796fa0> (a java.lang.Object)
    at DeadLock.DeadLock.lambda$main$1(DeadLock.java:50)
    at DeadLock.DeadLock$$Lambda$2/793589513.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:748)
"Thread-0":
    at DeadLock.DeadLock.m(DeadLock.java:25)
    - waiting to lock <0x0000000795796fa0> (a java.lang.Object)
    - locked <0x0000000795796f90> (a java.lang.Object)
    at DeadLock.DeadLock.lambda$main$0(DeadLock.java:49)
    at DeadLock.DeadLock$$Lambda$1/284720968.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:748)

Found 1 deadlock.

如何解决死锁

定位到死锁的代码块之后,进行代码分析,针对不同的场景下重新编写相应的代码。

  1. 降低锁的粒度
  2. 调整获取锁的顺序

死循环与死锁的区别

通过top查看,死循环一般会大量占用cpu的资源,而死锁则是线程之间相互等待,一般不会出现这种现象。

PID   COMMAND      %CPU  TIME     #TH   #WQ  #PORT MEM    PURG   CMPRS  PGRP PPID STATE    BOOSTS          %CPU_ME %CPU_OTHRS UID  FAULTS    COW    MSGSENT   MSGRECV   SYSBSD
5919  top          3.6   00:08.83 1/1   0    25    5452K  0B     1048K  5919 5790 running  *0[1]           0.00000 0.00000    0    56553+    97     1610538+  805123+   220539+
5911  java         99.0  04:56.31 19/1  1    77    16M    0B     12M    5426 5426 running  *0[1]           0.00000 0.00000    501  9599      355    122       42        18003+
5910  java         0.0   00:04.65 19    1    77    113M   0B     72M    5426 5426 sleeping *0[1]           0.00000 0.00000    501  52273     356    131       45        42941+
5906  com.apple.au 0.0   00:00.02 2     2    21    844K   0B     728K   5906 1    sleeping  0[2]           0.00000 0.00000    501  2603      140    112       37        490
5905  mdworker_sha 0.0   00:00.10 3     1    59    3320K  0B     2252K  5905 1    sleeping *0[1]           0.00000 0.00000    501  3878      232    636       254       1000
5896  ocspd        0.0   00:00.04 2     1    27    1480K  0B     772K   5896 1    sleeping *0[1]           0.00000 0.00000    0    2174      134    264       27        598
5895  java         0.0   00:00.81 21    1    81    21M    0B     10M    5426 5426 sleeping *0[1]           0.00000 0.00000    501  10913     355    130       45        25733+

你可能感兴趣的:(java死锁与死循环)