2011-03-09 1 views
6

J'écris mon classloader personnalisé, et je me demande si je devrais le rendre thread-safe? Comme vous pouvez facilement le voir, tous les classloaders Java natifs ne sont pas thread-safe, seulement sun.misc.Launcher.AppClassLoader (et pourtant, j'ai vérifié les sources OpenJDK, et dans OpenJDK ce n'est pas le cas).ClassLoader doit-il être thread-safe?

Y a-t-il une raison pour que les chargeurs de classe java ne soient pas synchronisés? Les classloaders personnalisés doivent-ils être thread-safe?

+3

Indique quel classloader n'est PAS threadsafe (et oui un ClassLoader doit être threadsafe) – bestsss

+2

L'utilisation de synchronized ne rend pas un thread sûr par lui-même. Étant donné le nombre de JVM différentes qui chargent des classes avec le même chargeur de classes à partir de plusieurs threads, je dirais qu'il est clairement démontré qu'il est threadsafe. Comment la sécurité du fil est accomplie peut ne pas être de la manière que vous attendez, cependant. – Yishai

Répondre

2

ClassLoader.loadClass() est synchronisé.

Généralement, un chargeur de classe personnalisé ne remplacera pas cette méthode, mais il peut remplacer findClass(). Puisque findClass() est appelé par loadClass et est donc appelé à partir d'une section critique synchronisée, il n'a pas besoin d'être lui-même synchronisé.

+0

en fait pour implémenter un chargeur de classe WebApp, loadClass doit être surchargé. La vraie méthode de synchronisation est la suivante: 'private synchronized Classe loadClassInternal (String name)' qui était (est?) La principale source d'inquiétude depuis des années: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4670071 – bestsss

+0

J'appelle findCalss-> loadClass chaîne directement, je suppose, il doit être synchronisé sur le même objet que loadClassInternal. Je n'ai pas encore trouvé quelles sont les spécificités derrière les appels loadClassInternal –

+0

Désolé, juste revérifié, findClass * IS * synchronisé, donc tant que je surcharge findClass seulement, il n'y a pas de confusion. Merci! –