При входе в синхронизированный метод виртуальная машина устанавливает блокировку текущего объекта.Таким образом, следующие коды имеют одинаковый эффект:
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
.Они могут обеспечить раздельную блокировку чтения и записи и повысить производительность вашего приложения. Lock Objects глава Oracle Java Tutorials - хорошее начало здесь.