Será que o código a seguir executar com sucesso?

Navjot Singh:

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.

espaço marca:

Sim, o código acima irá pedir um bloqueio em ambos SomeClasse o xyzobjeto. Isso não causa problemas no entanto.

O xyzobjetivo é private, portanto, não há possibilidade de que qualquer segmento vai primeira trave xyzantes 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.

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=213080&siteId=1
Recomendado
Clasificación