Если вы синхронизируете блок кода, то все, что вызывается из этого блока кода (в том же потоке), все еще содержит первоначальную блокировку. Таким образом, doSomethingElse
все еще является частью синхронизированного блока, когда он вызывается из doSomething
.
Если вы сделали:
public synchronized void doSomething() {
new Thread() {
public void run() {
doSomethingElse();
}
}.start();
}
private void doSomethingElse() {
}
Тогда doSomethingElse
будет не иметь блокировку, полученную doSomething
.
Также избегайте синхронизированных методов, так как это раскрывает детали реализации вашей политики параллелизма. См. Этот вопрос о синхронизированных (это) / синхронизированных методах: Избегать синхронизированных (это) в Java?
Если doSomethingElse
необходимо синхронизировать, независимо от того, вызывается он из doSomething
или нет, синхронизировать doSomethingElse
не помешает, так как синхронизированные блокировки являются входящими (т. Е. Если поток уже имеет заблокировать объект, он может снова получить блокировку).