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

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

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

输入同步方法时,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教程的“
锁定对象”一章是一个好的开始。




欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5055645.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-15
下一篇 2022-11-15

发表评论

登录后才能评论

评论列表(0条)

保存