Javaスレッドダンプ:「ロック待機」と「待機待機」の違いは?

ニコラ・ラウル:

Javaスレッドダンプでは、スタックトレース内で言及されたロックを確認できます。
3種類の情報があるようです。

1:

- locked <0x00002aab329f7fa0> (a java.io.BufferedInputStream)

2:

- waiting to lock <0x00002aaaf4ff6fa0> (a org.alfresco.repo.lock.LockServiceImpl)

3:

- parking to wait for  <0x00002aaafbf70bb8> (a java.util.concurrent.SynchronousQueue$TransferStack)
  • 1:スレッドはオブジェクト0x00002aab329f7fa0のロックを取得しました。
  • 2&3:スレッドは、そのオブジェクトのロックが利用可能になるのを待っていると言っているようです...
    しかし、2と3の違いは何ですか?
rgerganov:

組み込みロックを使用する場合はスレッドダンプで「ロック待ち」を取得し、java.util.concurrentからのロックを使用する場合は「待機待ち」を取得します。次の例について考えてみます。

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class LockTest {

    final Lock lock = new ReentrantLock(true);

    synchronized void intrinsicLock() {
        Thread th = new Thread(new Runnable() {
            public void run() {
                intrinsicLock();
            }
        }, "My thread");
        th.start();
        try {
            th.join();
        } catch (InterruptedException e) {
        }
    }

    void reentrantLock() {
        lock.lock();
        Thread th = new Thread(new Runnable() {
            public void run() {
                reentrantLock();
            }
        }, "My thread");
        th.start();
        try {
            th.join();
        } catch (InterruptedException e) {
        }
        lock.unlock();
    }


    public static void main(String[] args) {
        LockTest lockTest = new LockTest();
        lockTest.intrinsicLock();
        //lockTest.reentrantLock();
    }

}

ではlockTest.intrinsicLock()、あなたは次のスレッドダンプを取得します。

"My thread" prio=10 tid=0x00007fffec015800 nid=0x1775 waiting for monitor entry [0x00007ffff15e5000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at LockTest.intrinsicLock(LockTest.java:9)
    - waiting to lock <0x00000007d6a33b10> (a LockTest)
    at LockTest$1.run(LockTest.java:11)
    at java.lang.Thread.run(Thread.java:662)

しばらくlockTest.reentrantLock()プロデュース:

"My thread" prio=10 tid=0x00007fffec082800 nid=0x17e8 waiting on condition [0x00007ffff14eb000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000007d6a33d30> (a java.util.concurrent.locks.ReentrantLock$FairSync)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:811)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:842)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1178)
    at java.util.concurrent.locks.ReentrantLock$FairSync.lock(ReentrantLock.java:201)
    at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:262)
    at LockTest.reentrantLock(LockTest.java:22)
    at LockTest$2.run(LockTest.java:25)
    at java.lang.Thread.run(Thread.java:662)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Javaスレッドの待機と通知

分類Dev

ブロックされたスレッド状態と待機中のスレッド状態の違い

分類Dev

Javaスレッドの待機と自動ウェイクアップ

分類Dev

Javaスレッドダンプ:待機中(オブジェクトモニター上)-何を待機していますか?

分類Dev

Mainが新しいスレッドをスピンするときに待機するのに、タスクでは待機しない理由

分類Dev

待機/通知ありとなしの同期ブロックの違いは?

分類Dev

Java待機/通知-スレッドをウェイクアップしない

分類Dev

スレッドは待機の問題の後に機能しないことを通知します-java

分類Dev

Javaスレッドビジー待機

分類Dev

Javaで待機中のスレッドをウェイクアップする

分類Dev

Javaのスレッドの待機と通知のシーケンス

分類Dev

スレッドはまだ待機中

分類Dev

しばらく(真)と待機()またはスレッドの違いは何であるの参加()

分類Dev

SSH -tがバックグラウンドプロセスを待機しないのはなぜですか?

分類Dev

スレッド待機通知のIllegalMonitorStateException

分類Dev

スレッド待機の実装

分類Dev

Javaスレッド割り込みは待機、参加、スリープのみ

分類Dev

Javaは待機をマルチスレッドと同じブロックに通知します

分類Dev

待機と睡眠の違い

分類Dev

ManualResetEventはスレッドプールの完了を待機していません

分類Dev

スレッドが待機するのを待つ方法

分類Dev

Javaスレッドの待機メソッドと通知メソッド

分類Dev

スレッドがロックの解放を待機しているタイミングを判別する

分類Dev

SwingWorker Javaを使用してスレッドプール内のタスクを待機しています

分類Dev

ロックされたミューテックスを待機しているときにスレッドはスリープしますか?

分類Dev

Rubyスレッドプログラミング、Javaの待機/通知/通知すべてに相当するRuby

分類Dev

Java CountDownLatchサンプルのメインスレッドは、latch.awaitを待機しません

分類Dev

Javaでスレッドを待機させるのは悪いことですか?

分類Dev

待機中のスレッドのJavaリスト

Related 関連記事

  1. 1

    Javaスレッドの待機と通知

  2. 2

    ブロックされたスレッド状態と待機中のスレッド状態の違い

  3. 3

    Javaスレッドの待機と自動ウェイクアップ

  4. 4

    Javaスレッドダンプ:待機中(オブジェクトモニター上)-何を待機していますか?

  5. 5

    Mainが新しいスレッドをスピンするときに待機するのに、タスクでは待機しない理由

  6. 6

    待機/通知ありとなしの同期ブロックの違いは?

  7. 7

    Java待機/通知-スレッドをウェイクアップしない

  8. 8

    スレッドは待機の問題の後に機能しないことを通知します-java

  9. 9

    Javaスレッドビジー待機

  10. 10

    Javaで待機中のスレッドをウェイクアップする

  11. 11

    Javaのスレッドの待機と通知のシーケンス

  12. 12

    スレッドはまだ待機中

  13. 13

    しばらく(真)と待機()またはスレッドの違いは何であるの参加()

  14. 14

    SSH -tがバックグラウンドプロセスを待機しないのはなぜですか?

  15. 15

    スレッド待機通知のIllegalMonitorStateException

  16. 16

    スレッド待機の実装

  17. 17

    Javaスレッド割り込みは待機、参加、スリープのみ

  18. 18

    Javaは待機をマルチスレッドと同じブロックに通知します

  19. 19

    待機と睡眠の違い

  20. 20

    ManualResetEventはスレッドプールの完了を待機していません

  21. 21

    スレッドが待機するのを待つ方法

  22. 22

    Javaスレッドの待機メソッドと通知メソッド

  23. 23

    スレッドがロックの解放を待機しているタイミングを判別する

  24. 24

    SwingWorker Javaを使用してスレッドプール内のタスクを待機しています

  25. 25

    ロックされたミューテックスを待機しているときにスレッドはスリープしますか?

  26. 26

    Rubyスレッドプログラミング、Javaの待機/通知/通知すべてに相当するRuby

  27. 27

    Java CountDownLatchサンプルのメインスレッドは、latch.awaitを待機しません

  28. 28

    Javaでスレッドを待機させるのは悪いことですか?

  29. 29

    待機中のスレッドのJavaリスト

ホットタグ

アーカイブ