ClassLoader应该是线程安全的吗?

ClassLoader应该是线程安全的吗?

问题描述:

我在写我的自定义类加载,而且我知道如果我要使它线程安全的? 正如你可以很容易地看到,并不是所有的本地Java类加载器是线程安全的,只有sun.misc.Launcher.AppClassLoader做(可是,我检查了OpenJDK源,并在OpenJDK的它不是)。ClassLoader应该是线程安全的吗?

是否有一个原因的Java类加载器不同步? 自定义类加载器应该是线程安全的吗?

+3

告诉它的类加载器不是线程安全的(是一个ClassLoader必须是线程) – bestsss 2011-03-09 21:07:15

+2

使用的同步,并不使一些线程安全本身。鉴于有多少不同的JVM使用多个线程中的同一个类加载器来加载类,我想说它绝对可以证明是线程安全的。虽然线程安全如何实现可能不符合您的期望。 – Yishai 2011-03-09 21:11:07

ClassLoader.loadClass()是同步的。

通常一个定制的ClassLoader不会重写此方法,但它可能会覆盖findClass()。由于findClass()被称为loadClass,因此从同步的关键部分调用,它本身并不需要同步。

+0

其实要实现一个WebApp类加载器,loadClass必须被overriden。真正的同步方法是:'私人同步类loadClassInternal(字符串名称)'这是(是什么?)多年的主要抱怨:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4670071 – bestsss 2011-03-09 23:01:28

+0

因为我我直接调用findCalss-> loadClass链,我假设它必须与loadClassInternal在同一个对象上进行同步。我还没有找出具体的背后loadClassInternal什么叫 – 2011-03-10 06:07:19

+0

不好意思,刚才复查,*的findClass为*同步,所以只要我只有重写的findClass,没有混乱。谢谢! – 2011-03-10 08:02:18