输入同步方法时,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教程的“
锁定对象”一章是一个好的开始。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)