2011-03-09 10 views
6

Estoy escribiendo mi cargador de clases personalizado, y me pregunto si debería hacerlo seguro para subprocesos? Como puede ver fácilmente, no todos los cargadores de clases Java nativos son seguros para subprocesos, solo sun.misc.Launcher.AppClassLoader lo hace (y, sin embargo, he comprobado las fuentes OpenJDK, y en OpenJDK no lo está).¿Debería ClassLoader ser seguro para subprocesos?

¿Hay alguna razón por la que los cargadores de clase java no estén sincronizados? ¿Deberían los cargadores de clase personalizados ser seguros para subprocesos?

+3

Indica qué cargador de clases NO es seguro para la rosca (y sí, un Cargador de clases debe ser seguro para la rosca) – bestsss

+2

El uso de sincronización no hace que algo sea seguro por sí mismo. Dado el número de clases de carga de JVM diferentes con el mismo cargador de clases de varios subprocesos, diría que definitivamente está demostrado que es seguro para la ejecución de subprocesos. Sin embargo, la forma en que se logra la seguridad de los hilos puede no ser la que esperas. – Yishai

Respuesta

2

ClassLoader.loadClass() está sincronizado.

Normalmente, un cargador de clases personalizado no anulará este método, pero puede anular findClass(). Como se llama al findClass() por loadClass y, por lo tanto, se llama desde una sección crítica sincronizada, no necesita ser sincronizado.

+0

de hecho para implementar un cargador de clases de aplicación web, loadClass debe ser anulado. El verdadero método de sincronización es: 'private synchronized Class loadClassInternal (String name)' que fue (¿es?) La principal queja durante años: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4670071 – bestsss

+0

Desde que Estoy llamando a la cadena findCalss-> loadClass directamente, supongo, debe estar sincronizado en el mismo objeto que loadClassInternal. Todavía tengo que averiguar qué hay detrás de las llamadas a loadClassInternal –

+0

Lo siento, solo volví a comprobar, findClass * IS * sincronizado, así que mientras esté anulando findClass solamente, no hay confusión. ¡Gracias! –

Cuestiones relacionadas