Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这个堆栈转储是否表示我有死锁?_Java_Concurrency_Deadlock - Fatal编程技术网

Java 这个堆栈转储是否表示我有死锁?

Java 这个堆栈转储是否表示我有死锁?,java,concurrency,deadlock,Java,Concurrency,Deadlock,我有一个REST服务 当我对restapi执行“curl”时,命令挂起 我运行了jstack&这是两个处于阻塞状态的线程的总结输出 "pool-2-thread-11" prio=6 tid=0x01d51800 nid=0x2394 waiting for monitor entry [0x05e6f000..0x05e6fce8] java.lang.Thread.State: BLOCKED (on object monitor) at com.moi.DefaultImage

我有一个REST服务

当我对restapi执行“curl”时,命令挂起

我运行了jstack&这是两个处于阻塞状态的线程的总结输出

"pool-2-thread-11" prio=6 tid=0x01d51800 nid=0x2394 
 waiting for monitor entry [0x05e6f000..0x05e6fce8]
java.lang.Thread.State: BLOCKED (on object monitor)
    at com.moi.DefaultImageProcessor$DownloadAndScaleCallable.call(
          DefaultImageProcessor.java:168)
    - waiting to lock <0x257aa440> 
     (com.moi.ImageUriMutexImpl$MutexImpl)
      at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
      at java.util.concurrent.FutureTask.run(FutureTask.java:138)
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
      at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
      at java.util.concurrent.FutureTask.run(FutureTask.java:138)
     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(
        ThreadPoolExecutor.java:885)

"pool-2-thread-10" prio=6 tid=0x01d51000 nid=0x18d0
 waiting for monitor entry [0x05e1f000..0x05e1fd68]
java.lang.Thread.State: BLOCKED (on object monitor)
    at com.moi.DefaultImageProcessor$DownloadAndScaleCallable.call(
          DefaultImageProcessor.java:168)
    - waiting to lock <0x257aa6b8> 
     (com.moi.ImageUriMutexImpl$MutexImpl)
      at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
      at java.util.concurrent.FutureTask.run(FutureTask.java:138)
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
      at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
      at java.util.concurrent.FutureTask.run(FutureTask.java:138)
     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(
        ThreadPoolExecutor.java:885)
“pool-2-thread-11”优先级=6 tid=0x01d51800 nid=0x2394
正在等待监视器条目[0x05e6f000..0x05e6fce8]
java.lang.Thread.State:阻塞(在对象监视器上)
在com.moi.DefaultImageProcessor$downloads和scaleCallable.call上(
DefaultImageProcessor.java:168)
-等待锁定
(com.moi.ImageUriMutexImpl$MutexImpl)
位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
位于java.util.concurrent.FutureTask.run(FutureTask.java:138)
位于java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
位于java.util.concurrent.FutureTask.run(FutureTask.java:138)
位于java.util.concurrent.ThreadPoolExecutor$Worker.runTask(
ThreadPoolExecutor.java:885)
“池2线程10”优先级=6 tid=0x01d51000 nid=0x18d0
正在等待监视器条目[0x05e1f000..0x05e1fd68]
java.lang.Thread.State:阻塞(在对象监视器上)
在com.moi.DefaultImageProcessor$downloads和scaleCallable.call上(
DefaultImageProcessor.java:168)
-等待锁定
(com.moi.ImageUriMutexImpl$MutexImpl)
位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
位于java.util.concurrent.FutureTask.run(FutureTask.java:138)
位于java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
位于java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
位于java.util.concurrent.FutureTask.run(FutureTask.java:138)
位于java.util.concurrent.ThreadPoolExecutor$Worker.runTask(
ThreadPoolExecutor.java:885)
我想知道如何读取这个堆栈转储。在僵局中我应该寻找什么迹象


更新我解决了我的问题!基本上,我是在同步块中执行HttpClient 4.0访问。HttpClient表现不好&没有返回&它保留了锁。通过jstack,有两个线程持有锁,这导致了上述问题。我现在明白了,这并不是死锁,而是我的同步块花了太长时间才返回。

如果您注意到命令“挂起”,并且您已经识别出一个互斥锁上阻塞的两个线程。。。我得说你很清楚这些标志


这取决于你的服务是什么。查找性能问题和数据一致性问题。例如,由于请求量的增加而陷入困境而没有响应,甚至严重影响性能,这些都是您可能遇到问题的好迹象。此外,多个请求之间不一致的数据(同样,取决于您的服务)也可能会导致问题。

如果您注意到命令“挂起”,并且您已确定在互斥锁上阻塞了两个线程。。。我得说你很清楚这些标志


这取决于你的服务是什么。查找性能问题和数据一致性问题。例如,由于请求量的增加而陷入困境而没有响应,甚至严重影响性能,这些都是您可能遇到问题的好迹象。此外,多个请求之间不一致的数据(同样,取决于您的服务)也可能表明存在问题。

从小堆栈跟踪中,线程只等待获取锁。在跟踪中查找对象0x257aa440和0x257aa6b8,并查看是谁锁定了这些对象。检查该线程是否被阻塞


在死锁情况下,您将看到一个完整的阻塞状态循环。还要多次进行跟踪,以确认阻塞状态是瞬时还是长时间等待。

从小堆栈跟踪中,线程仅等待获取锁。在跟踪中查找对象0x257aa440和0x257aa6b8,并查看是谁锁定了这些对象。检查该线程是否被阻塞


在死锁情况下,您将看到一个完整的阻塞状态循环。还要多次进行跟踪,以确认阻塞状态是暂时的还是长时间的等待。

这是两个线程在争夺同一资源,因此不,这在iself中不是问题。不过,这可能是问题的一半

如果这两个线程是唯一被阻塞的线程,那么您就不会处于死锁状态。死锁(最简单的形式)是两个线程在两个不同的对象上都有一个锁,但它们都希望在另一个对象上有一个锁

也就是说,从你提供的情况来看,不,你没有陷入僵局。但如果事情悬而未决,并开始备份,那么这是一个很好的可能性,但不可能(或至少很难)从堆栈转储中确定


编辑:等等,它们没有锁定在同一个对象上。但是两个线程都在同一个函数中。我发现这不太可能(单独)导致死锁,但它可能是线程循环的一部分,导致死锁。

这是两个线程争用同一资源,因此,不,这本身不是问题。不过,这可能是问题的一半

如果这两个线程是唯一被阻塞的线程,那么您就不会处于死锁状态。死锁(最简单的形式)是两个线程在两个不同的对象上都有一个锁,但它们都希望在另一个对象上有一个锁

也就是说,从你提供的情况来看,不,你没有陷入僵局。但如果事情悬而未决,并开始备份,那么这是一个很好的可能性,但不可能(或至少很难)从堆栈转储中确定

编辑:等等,它们没有锁定在同一个对象上。但是两个线程都在同一个函数中。我发现这不太可能(单独)导致死锁,但它可能是导致死锁的线程循环的一部分。

a(常规)死锁
"Thread-1" prio=10 tid=0x0841ac00 nid=0x77d waiting for monitor entry [0xb42bf000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at Deadlock$Friend.bowBack(Deadlock.java:16)
    - waiting to lock <0x8b80def8> (a Deadlock$Friend)
    at Deadlock$Friend.bow(Deadlock.java:13)
    - locked <0x8b80df08> (a Deadlock$Friend)
    at Deadlock$2.run(Deadlock.java:28)
    at java.lang.Thread.run(Thread.java:619)

"Thread-0" prio=10 tid=0x08419400 nid=0x77c waiting for monitor entry [0xb4310000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at Deadlock$Friend.bowBack(Deadlock.java:16)
    - waiting to lock <0x8b80df08> (a Deadlock$Friend)
    at Deadlock$Friend.bow(Deadlock.java:13)
    - locked <0x8b80def8> (a Deadlock$Friend)
    at Deadlock$1.run(Deadlock.java:25)
    at java.lang.Thread.run(Thread.java:619)



Found one Java-level deadlock:
=============================
"Thread-1":
  waiting to lock monitor 0x083f1464 (object 0x8b80def8, a Deadlock$Friend),
  which is held by "Thread-0"
"Thread-0":
  waiting to lock monitor 0x083efc90 (object 0x8b80df08, a Deadlock$Friend),
  which is held by "Thread-1"

Java stack information for the threads listed above:
===================================================
"Thread-1":
    at Deadlock$Friend.bowBack(Deadlock.java:16)
    - waiting to lock <0x8b80def8> (a Deadlock$Friend)
    at Deadlock$Friend.bow(Deadlock.java:13)
    - locked <0x8b80df08> (a Deadlock$Friend)
    at Deadlock$2.run(Deadlock.java:28)
    at java.lang.Thread.run(Thread.java:619)
"Thread-0":
    at Deadlock$Friend.bowBack(Deadlock.java:16)
    - waiting to lock <0x8b80df08> (a Deadlock$Friend)
    at Deadlock$Friend.bow(Deadlock.java:13)
    - locked <0x8b80def8> (a Deadlock$Friend)
    at Deadlock$1.run(Deadlock.java:25)
    at java.lang.Thread.run(Thread.java:619)

Found 1 deadlock.