¿Existe un escenario único (aparte de la compatibilidad con JVM antiguas) en el que synchronized
es preferible usar a Lock
? ¿Alguien puede justificar el uso wait
o notify
sobre los sistemas más nuevos?
¿Hay algún algoritmo que deba usar uno de ellos en su implementación?
Veo preguntas anteriores que tocaron este asunto, pero me gustaría llevar esto un poco más allá y, de hecho, a deprecate
ellas. Hay demasiadas trampas, trampas y advertencias con ellas que se han solucionado con las nuevas instalaciones. Siento que pronto será hora de marcarlos como obsoletos.
java
synchronization
deprecation
OldCurmudgeon
fuente
fuente
Respuestas:
Casi seguro que no. (De hecho, desde el punto de vista teórico, debe ser capaz de simular espera / informen mediante otra java.util.concurrent. . Clases. Y sincronizada podría ser reemplazado con las operaciones de bloqueo explícitas ... aunque usted tendría que tener cuidado de desbloqueo en
finally
cláusulas)Sin embargo, probablemente existan algoritmos en los que la implementación de mejor rendimiento en Java implique el uso directo de sincronizado, con o sin esperar y notificar.
Independientemente de la respuesta a la pregunta anterior, la respuesta es definitivamente no.
La espera / notificación se puede usar (y a menudo se usa) correctamente. En Java, la desaprobación está reservada para clases y métodos que no funcionan; es decir, donde el uso continuado debe corregirse con urgencia. Si Sun (y ahora Oracle) desaprobara algo tan fundamental y tan utilizado como esperar / notificar, estarían creando un serio problema de compatibilidad para grandes cantidades de código heredado. Eso NO interesa a nadie.
Si desea deshacerse de sincronizado / esperar / notificar en su código, está bien. Pero la desaprobación exige la reescritura de grandes cantidades de código multiproceso esencialmente correcto, y eso sería una MALA IDEA. Los gerentes corporativos de TI y los gerentes de productos de software lo odiarían por sugerirlo ...
Vale la pena leer lo que significa "obsoleto" de acuerdo con la documentación de Java: http://docs.oracle.com/javase/1.5.0/docs/guide/javadoc/deprecation/deprecation.html
Y también tenga en cuenta que estamos hablando de desaprobar cosas que son fundamentales para el lenguaje Java. Depreciar
synchronized
tiene enormes consecuencias.fuente
java.util.concurrent
clases de utilidad son en realidad más rápidas. Detrás de escena, estas clases hablan directamente con la máquina virtual, donde, como sincronizado, se instala un bloqueo contundente en el objeto en el gráfico del objeto y, por lo tanto, afecta el rendimiento global.synchronized
et. Alabama. Simplemente estoy sugiriendo desaprobación, que en realidad solo dice que no uses esto para código nuevo. No soñaría con sugerir que el código heredado dañado y probado exija su eliminación.