簡體   English   中英

如何檢查線程是否在同步塊或方法中?

[英]How can I check if a thread is inside a synchronized block or method?

我的Java應用程序使用兩個Threads。 從歷史上看,有使用的同步方法和專用鎖定對象。 我需要知道當前線程是否有鎖,如果是方法或對象。 我怎樣才能做到這一點?

當輸入同步方法時,VM會在當前對象上設置鎖定。 因此,以下代碼具有相同的效果:

synchronized void syncMethod() {
    // do something
}

void syncManually() {
    synchronized (this) {
        // do something
    }
}

這意味着synchronized方法與完全相同

synchronized( lock ) {
    // do something
}

代碼中的任何位置。

您可以使用Thread.holdsLock(...)來檢查線程是否包含特定鎖。 這是一個示例代碼:

final Object lock = new Object(); 

public void lockDemo() {

    System.out.println( Thread.holdsLock(lock) );     // false
    System.out.println( Thread.holdsLock(this) );     // false

    synchronized ( lock ) { 
      System.out.println( Thread.holdsLock(lock) );   // true: locked by object
      System.out.println( Thread.holdsLock(this) );   // false
    }

    doSyncMethod();
}

public synchronized void doSyncMethod() {
    System.out.println( Thread.holdsLock(lock) );  // false
    System.out.println( Thread.holdsLock(this) );  // true: locked by synchronized method
}

自Java 1.5以來, java.util.concurrent.locks包支持更復雜的鎖,如ReentrantReadWriteLock 它們可以提供獨立的讀寫鎖定並提高應用程序的性能。 Oracle Java Tutorials的Lock Objects一章是一個很好的開始。

如果手動請求線程轉儲,JVM將打印出每個線程的堆棧跟蹤,包括鎖定或等待同步塊的對象/方法。

您可以通過在* nix中向JVM進程發送SIGQUIT或在啟動JVM的Windows命令提示符窗口中鍵入CTRL-Break (而不是Ctrl-C )來手動請求線程轉儲。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM