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
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?