2011-02-26 11 views
5

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?

+0

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

Respuesta

1

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.

0

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.