【问题标题】:Should ClassLoader be thread-safe?ClassLoader 应该是线程安全的吗?
【发布时间】:2011-03-10 14:09:50
【问题描述】:

我正在编写我的自定义类加载器,我想知道我是否应该让它成为线程安全的? 如您所见,并非所有本机 Java 类加载器都是线程安全的,只有 sun.misc.Launcher.AppClassLoader 可以(然而,我检查了 OpenJDK 源代码,而在 OpenJDK 中不是)。

java类加载器不同步有什么原因吗? 自定义类加载器应该是线程安全的吗?

【问题讨论】:

  • 告诉哪个类加载器不是线程安全的(是的,一个类加载器必须是线程安全的)
  • 使用 synchronized 本身并不能保证线程安全。鉴于有多少不同的 JVM 从多个线程使用相同的类加载器加载类,我会说它绝对被证明是线程安全的。但是,线程安全的实现方式可能与您期望的不同。

标签: java classloader


【解决方案1】:

ClassLoader.loadClass() 已同步。

通常自定义类加载器不会覆盖此方法,但它可能会覆盖findClass()。由于findClass()loadClass 调用,因此是从同步的临界区调用的,因此它本身不需要同步。

【讨论】:

  • 实际上要实现一个 WebApp 类加载器,必须重写 loadClass。真正的同步方法是:private synchronized Class loadClassInternal(String name),这是(是?)多年来的主要抱怨:bugs.sun.com/bugdatabase/view_bug.do?bug_id=4670071
  • 由于我直接调用 findCalss->loadClass 链,我假设它必须在与 loadClassInternal 相同的对象上同步。我还没有弄清楚 loadClassInternal 调用背后的细节
  • 对不起,刚刚重新检查,findClass IS 同步,所以只要我只覆盖 findClass,就没有混淆。谢谢!
猜你喜欢
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
  • 2021-10-12
  • 2015-04-18
  • 2011-10-07
相关资源
最近更新 更多