En Java, ¿generalmente se considera seguro sincronizar explícitamente en un objeto de un tipo de clase que no escribió? Pregunto esto porque parece que si ese objeto internamente intenta sincronizarse consigo mismo, entonces potencialmente podría haber un punto muerto no intencionado entre otro hilo tratando de usar un método no sincronizado de ese objeto que internamente adquiera el monitor del objeto y el hilo que adquiera explícitamente el bloqueo en el objeto. Nunca escuché ni leí nada diciendo que esta es una mala idea, aunque parece que podría serlo.¿Sincronización en clases de biblioteca/terceros?
Respuesta
Java te permite hacer esto, pero NO LO HAGAS. Debes trabajar muy duro para encapsular el bloqueo dentro de una clase, o dentro de la unidad más pequeña posible.
El bloqueo de un objeto que no es de su propiedad y no comprende completamente puede causar bloqueos y otras confusiones.
Eche un vistazo a this question y piense cómo se aplica al bloqueo en objetos de terceros.
Además, la referencia obligatoria a JCiP -- Read Java Concurrency in Practice para una discusión completa, legible y de alta calidad sobre cómo construir programas concurrentes.
Creo que la respuesta a esta pregunta se reduce a la confianza. ¿Confías en que el escritor de la clase escriba sus objetos de tal manera que el problema que mencionas no ocurra? Si es así, ve por ello. Si no, entonces ya ha dado el ejemplo del tiempo que esto podría causar un problema.
Si "parece que podría ser una mala idea", probablemente lo sea. Enhebrar es voluble y, a menos que pueda probar que es correcto, es muy probable que no (a menos que sea completamente accidental).
Si fuera yo, sería conservador y no sincronizaría un objeto que no controlé por completo, por lo que podría estar seguro de que es correcto, sin conjeturas.
- 1. clases y sincronización anónimas de Java y "esto"
- 2. bucle de sincronización estancamiento
- 3. Listboxes, desplazamiento en sincronización
- 4. Java: ¿Sincronización en primitivas?
- 5. Acciones de sincronización en Silverlight
- 6. Sincronización de AddressBook en iOS
- 7. sincronización interna en el mismo objeto que la sincronización externa
- 8. configuración de sincronización general casilla de verificación "sincronización automática" programáticamente
- 9. Aserción del orden de sincronización en Java
- 10. Sincronización en vectores en Java
- 11. InteropBitmap sincronización
- 12. Sincronización IMAP
- 13. sincronización de objetos
- 14. secuencia de comandos dinámica carga de sincronización
- 15. Algoritmos de sincronización
- 16. sincronización de hilos java
- 17. Qt barrera de sincronización?
- 18. Sincronización de una cola
- 19. GPS Sincronización de tiempo
- 20. Costo de sincronización
- 21. Sincronización simple de subprocesos
- 22. Sincronización Java
- 23. jQuery fuera de sincronización
- 24. Sincronización de desplazamiento UIScrollView
- 25. Sincronización en un valor entero
- 26. Sincronización en subprocesos para Java
- 27. Sincronización en un caché HashMap
- 28. Sincronización correcta equals() en Java
- 29. Opciones de sincronización de JavaScript
- 30. Sincronización de estilo Etherpad en Meteor?
el objeto no intentará sincronizarse en sí mismo de la nada (a menos que su API de terceros sea * a) * hilos de desove y * b) * haciendo cosas muy raras). Básicamente, el problema ocurre cuando ** usted ** hará lo que se llama * * método extraterrestre llamado *. En Java efectivo se explica que nunca debe realizar llamadas a métodos extraños con un bloqueo. – SyntaxT3rr0r