Java 如何检查线程是否在同步块或方法中?

Java 如何检查线程是否在同步块或方法中?,java,concurrency,Java,Concurrency,我的Java应用程序使用两个线程。历史上,有同步方法和专用锁对象在使用。我需要知道当前线程是否有锁,以及它是通过方法还是对象。如何执行此操作?如果手动请求线程转储,JVM将打印每个线程的堆栈跟踪,包括锁定或等待同步块的对象/方法 您可以通过在*nix中向JVM进程发送SIGQUIT或在启动JVM的Windows命令提示符窗口中键入CTRL-Break(而不是CTRL-C)来手动请求线程转储。当输入同步方法时,VM会对当前对象设置锁定。因此,以下代码具有相同的效果: synchronized vo

我的Java应用程序使用两个线程。历史上,有同步方法和专用锁对象在使用。我需要知道当前线程是否有锁,以及它是通过方法还是对象。如何执行此操作?

如果手动请求线程转储,JVM将打印每个线程的堆栈跟踪,包括锁定或等待同步块的对象/方法


您可以通过在*nix中向JVM进程发送SIGQUIT或在启动JVM的Windows命令提示符窗口中键入
CTRL-Break
(而不是
CTRL-C
)来手动请求线程转储。

当输入同步方法时,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
包支持。 它们可以提供单独的读写锁定,并提高应用程序的性能。Oracle Java教程的这一章是一个良好的开端