Objeto en código sincronizado volvió de un método

Tomer Armarnik:

Quiero tener un bloque sincronizado donde el objeto de sincronizar se devuelve desde una llamada de método:

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

¿Hay una suposición de que la "someGetMethod" se sincroniza o sólo la sección "// bloque sincronizado"?

Gracias de antemano

Editar: Tengo una colección (Mapa de los objetos de bloqueo). Los cheques "someGetMethod" si un objeto está presente en el Mapa, si no que se sumará y devolverlo con el fin de ser bloqueado. A partir de las respuestas a continuación, entiendo que la "someGetMethod" puede devolver un valor que ya está en el mapa, pero justo antes de entrar en el bloque sincronizado, cambie a otro hilo, que puede quitar el valor anterior. Como resultado otro hilo puede hacer lo mismo a través de cheque "someGetMethod" y ahora obtener un resultado diferente .. Por lo que parece que debería hacer el quite desde el interior del bloque sincronizado, ¿hay una mejor opción?

Edit2: Gracias a todos por su ayuda. He encontrado una pregunta similar - Java sincronizado bloque mediante una llamada a método para obtener el objeto de sincronización

Andrew Tobilko:

someGetMethod() es una expresión que se evalúa antes de que el monitor asociado con el resultado de la expresión está bloqueado por un hilo.

14.19. La Declaración sincronizado

Una declaración sincronizado se ejecuta mediante la evaluación de la primera expresión. Luego:

  • Si la evaluación de la expresión completa bruscamente por alguna razón, entonces la declaración sincronizado completa bruscamente por la misma razón.

  • De lo contrario, si el valor de la expresión es nula, una NullPointerException es lanzada.

  • De lo contrario, dejar que el valor no nulo de la expresión sea V. El subproceso en ejecución bloquea el monitor asociado con V. Entonces se ejecuta el bloque , y luego hay una elección:

    • Si la ejecución del bloque se completa con normalidad, a continuación, el monitor está desbloqueado y el estado sincronizado se completa con normalidad.

    • Si la ejecución del bloque termina abruptamente por cualquier motivo, a continuación, el monitor está desbloqueado y el estado sincronizado completa bruscamente por la misma razón.

No se puede entrar en un bloque sincronizado, evaluar la expresión, y luego mirar el monitor asociado con el resultado. ¿Cómo entrar en el bloque sin evaluar su expresión en el primer lugar? Lo monitor de usaste para sincronizar someGetMethod()sí?

Supongo que te gusta

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