我的Java应用程序使用两个Threads.从历史上看,有使用的同步方法和专用锁定对象.我需要知道当前线程是否有锁,如果是方法或对象.我怎样才能做到这一点?
Chr*_*ris 18
当输入同步方法时,VM会在当前对象上设置锁定.因此,以下代码具有相同的效果:
synchronized void syncMethod() {
// do something
}
void syncManually() {
synchronized (this) {
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
这意味着synchronized方法与完全相同
synchronized( lock ) {
// do something
}
Run Code Online (Sandbox Code Playgroud)
代码中的任何位置.
您可以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
}
Run Code Online (Sandbox Code Playgroud)
由于Java 1.5好像更复杂的锁的ReentrantReadWriteLock由支持java.util.concurrent.locks
包.它们可以提供独立的读写锁定并提高应用程序的性能.Oracle Java Tutorials 的Lock Objects一章是一个很好的开始.
归档时间: |
|
查看次数: |
5918 次 |
最近记录: |