Si eso es todo lo que se encuentra en el bloque sincronizado entonces es un anti patrón, el punto de sincronización es hacer algo dentro del bloque, el establecimiento de alguna condición, a continuación, llamar notify
o notifyAll
para despertar una o más hilos de espera.
Cuando se utiliza de espera y notificar usted tiene que utilizar una variable de estado, ver this Oracle tutorial:
Nota: Siempre invocar espera dentro de un bucle que las pruebas para la enfermedad que se esperaban. No suponga que la interrupción fue para la condición particular que estaba esperando, o que la condición sigue siendo verdadera.
Usted no debe asumir que ha recibido una notificación sólo porque salía un hilo de una llamada a objeto # esperan, por múltiples razones:
Al llamar a la versión de esperar que toma un valor de tiempo de espera No hay forma de saber si la espera terminó debido a recibir una notificación o debido a un tiempo de espera.
Tiene que permitir la posibilidad de que un subproceso pueda despertar sin haber recibido una notificación (el "despertador espurio").
El hilo de espera que recibe una notificación todavía tiene que volver a adquirir el bloqueo que abandonó cuando comenzó a esperar, no hay un enlace atómico de estos dos eventos; en el intervalo entre la notificación y la readquisición del bloqueo, otro subproceso puede actuar y posiblemente cambiar el estado del sistema para que la notificación no sea válida.
Puede tener un caso donde el hilo notificador actúa antes de que un hilo esté esperando para que la notificación no tenga ningún efecto. Suponiendo que un hilo entrará en espera antes de que el otro hilo lo notifique sea peligroso, si está equivocado, el hilo de espera se colgará indefinidamente.
Así una notificación por sí sola no es suficiente, se termina tratando de adivinar si una notificación ocurrió cuando la espera/notificar a la API no le da suficiente información para saber lo que está pasando. Incluso si otro trabajo que realiza el hilo de notificación no requiere sincronización, la actualización de la variable de condición sí lo requiere; al menos debería haber una actualización de la variable de condición compartida en el bloque sincronizado.
I * * pensar que esto es más apropiado para http://codereview.stackexchange.com – BalusC
Material de lectura: http://stackoverflow.com/questions/442564/avoid-synchronizedthis-in- java – claymore1977
¿Se está preguntando si la sincronización es necesaria antes de la llamada a 'notify()'? El hilo ** debe ** sostener el monitor del objeto cuando llama a 'notify()', por lo que esto es obligatorio en general. –