Em Brian Goetz Java Concurrency in Practice, há seguindo o exemplo que explica a reentrada dos bloqueios em Java como:
public class Widget {
public synchronized void doSomething() {
...
}
}
public class LoggingWidget extends Widget {
public synchronized void doSomething() {
System.out.println(toString() + ": calling doSomething");
super.doSomething();
}
}
Ele diz que, devido à reentrada de bloqueios em Java, o código acima não vai levar a um impasse, já que os bloqueios são atingidos em base por thread ao invés de base por invocação.
No entanto, se torcer o exemplo um pouco como:
public class XYZ {
public synchronized void someFunction() {
...
}
}
public class SomeClass {
private XYZ xyz;
...
public synchronized void functionCalled() {
...
xyz.someFunction();
}
}
Chamamos a functionCalled () de SomeClass eo bloqueio é obtido no objeto de SomeClass. Agora, vai a someFunction () são chamados ou em outros termos que o fio entrar no someFunction () da classe xyz. Será que a função sincronizada de classe XYZ pedir bloqueio sobre o objeto da classe XYZ? Eu estou um pouco confuso. Por favor, esclareça.
Sim, o código acima irá pedir um bloqueio em ambos SomeClass
e o xyz
objeto. Isso não causa problemas no entanto.
O xyz
objetivo é private
, portanto, não há possibilidade de que qualquer segmento vai primeira trave xyz
antes de invocar functionCalled()
, portanto, não há possibilidade de bloqueio mortos desde que os dois bloqueios aqui são sempre chamados na ordem SomeClass
-> xyz
.