当前位置: 首页 > 面试题库 >

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

狄飞尘
2023-03-14
问题内容

我的Java应用程序使用两个线程。从历史上看,有同步方法和专用锁对象在使用。我需要知道当前线程是否具有锁,以及它是按方法还是按对象。我怎样才能做到这一点?


问题答案:

输入同步方法时,VM会在当前对象上设置锁定。因此,以下代码具有相同的效果:

synchronized void syncMethod() {
    // do something
}

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

这意味着同步方法与

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开始,该软件包支持诸如ReentrantReadWriteLock之类的更复杂的锁java.util.concurrent.locks。它们可以提供单独的读写锁定,并提高应用程序的性能。Oracle
Java教程的“
锁定对象”一章是一个好的开始。




 类似资料:
  • 问题内容: 有什么方法可以检查给定线程是否正在休眠? 问题答案: 您可以呼叫并检查状态是否为。 请注意,但这并不一定意味着调用的线程也可能正在调用中或其他类似的事件中等待。

  • 问题内容: 如果我在同步块内创建一个新线程,该块是否将保持锁定状态,直到线程执行完成为止?如果没有,那么直到什么时候才能保持锁定状态? 问题答案: 如果代码d具有新创建的线程,则它将保持锁定,从而等待它完成。由于没有锁,因此在调用完成后将不释放锁定。

  • 本文向大家介绍如何在C#中检查线程是否为后台线程,包括了如何在C#中检查线程是否为后台线程的使用技巧和注意事项,需要的朋友参考一下 要检查线程是否是后台线程,代码如下: 示例 输出结果 这将产生以下输出- 示例 让我们看另一个例子- 输出结果 这将产生以下输出-

  • 我需要检查运行某段代码的线程是否是主(UI)线程。我怎样才能做到这一点呢?

  • 方法有一个有趣的属性,它将允许其他线程在被阻止时进入其同步块。例如(假设线程1首先运行): 线程1: 线程2: 线程 2 能够唤醒线程 1 的事实意味着线程 2 进入了同步块,即使其他某个线程位于同一对象的同步块中也是如此。这对我来说很好,但我想知道这是否只发生在或所有会使线程“等待”的方法()上。在我的情况下,我关心,因为如果行为与相同,它会破坏我的代码: 那么,多个线程是否可能因为join调用

  • 本文向大家介绍java多线程编程之Synchronized块同步方法,包括了java多线程编程之Synchronized块同步方法的使用技巧和注意事项,需要的朋友参考一下 文章分享了4个例子对synchronized的详细解释 1、是否加synchronized关键字的不同 加了synchronized关键字的输出结果如下 会先输出一组0-4,接着再输出下一组,两个线程顺序执行 excute:0