Objeto em código Synchronized retornado de um método

Tomer Armarnik:

Eu quero ter um bloco sincronizado onde o objeto para sincronizar é retornado de uma chamada de método:

...
synchronized( someGetMethod() ) {
// synchronized block
}
...

Existe uma suposição de que o "someGetMethod" é sincronizado ou apenas a seção "// bloco sincronizado"?

Agradeço antecipadamente

Edit: Eu tenho uma coleção (Mapa de objetos para bloqueio). Os "someGetMethod" verifica se um objeto está presente no Mapa, se não ele vai adicioná-lo e devolvê-lo, a fim de ser bloqueado. A partir das respostas abaixo, eu entendo que o "someGetMethod" pode retornar um valor que já está no mapa, mas apenas antes de entrar no bloco sincronizado, mude para outro segmento, que pode remover o valor acima. Como resultado outro segmento pode fazer a mesma verificação via "someGetMethod" e agora obter um resultado diferente .. Assim, parece que eu deveria fazer a retirada de dentro do bloco sincronizado, há uma opção melhor?

Edit2: Obrigado a todos por sua ajuda. Eu encontrei uma pergunta semelhante - Java sincronizado bloco usando a chamada de método para obter objeto sincronia

Andrew Tobilko:

someGetMethod() é uma expressão que é avaliada antes do monitor associada com o resultado da expressão está bloqueado por um fio.

14.19. A Demonstração sincronizado

Uma declaração sincronizado é executado pela primeira avaliação da expressão. Então:

  • Se a avaliação da expressão completa abruptamente por alguma razão, então a declaração sincronizado termina abruptamente pela mesma razão.

  • Caso contrário, se o valor da expressão é nulo, uma NullPointerException é lançada.

  • Caso contrário, deixe o valor não nulo do Expression ser V. O thread em execução bloqueia o monitor associado com V. Em seguida, o bloco é executado , e depois há uma escolha:

    • Se a execução do Bloco concluído normalmente, em seguida, o monitor é desbloqueado ea declaração sincronizado concluído normalmente.

    • Se a execução do Bloco termina abruptamente por qualquer motivo, em seguida, o monitor é desbloqueado ea declaração sincronizado termina abruptamente pela mesma razão.

Você não pode entrar em um bloco sincronizado, avaliar a expressão, e depois olhar para o monitor associado com o resultado. Como você entra na quadra sem avaliar sua expressão em primeiro lugar? O monitor de você usou para sincronizar someGetMethod()-se?

Acho que você gosta

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