关于Java SE 7中的多线程自定义类加载器

时间:2012-01-06 18:52:56

标签: java multithreading classloader java-7 heisenbug

嗨:我对添加多线程类加载器(SE7)感到困惑。

在多线程类加载期间有一个很好的解释,这是http://docs.oracle.com/javase/7/docs/technotes/guides/lang/cl-mt.html ....但是,我从来没有遇到过这个错误,并编写了几个实现了很多继承的多线程应用程序。

我刚刚幸运吗?或者这是一个真正的问题。如果是后者,那么

有人能为我提供一个真实世界(非抽象)的方法来在一个简单的应用程序中重现这个bug吗?

最终,我最基本的问题是JDK类加载器死锁只是一个低级别的案例heisenbug ,这并不会导致很多问题,或者这是真的,严重的功能添加到JDK?

2 个答案:

答案 0 :(得分:0)

本文特定于自定义编写的多线程类加载器,而不仅仅是多线程应用程序。除非您正在编写或使用多线程自定义类加载器,否则看起来问题不会影响您。

如果您使用多线程自定义类加载器,那么显然如果在JDK 7中正确编写它将不会死锁。

答案 1 :(得分:0)

对于使用自定义线程类加载器的有限数量的应用程序来说,这似乎是一个相对严重的问题。如果不知道你在做什么,很难说它是否是一个问题。但是,如果你已经看到锁定行为,他们提供了避免它的方法。

  1. 确保您的自定义类加载器是多线程安全的 并发类加载。

    决定内部锁定方案。例如,java.lang.ClassLoader使用基于所请求的类名的锁定方案。

    单独删除类加载器对象锁上的所有同步。

    确保关键部分对于加载不同类的多个线程是安全的。

  2. 在自定义类加载器的静态初始化程序中,调用 java.lang.ClassLoader的静态方法registerAsParallelCapable()。 此注册表示您的自定义类的所有实例 装载机是多线程安全的。

  3. 检查所有类加载器类是否为此自定义类加载器 extends也调用了registerAsParallelCapable()方法 类初始化器。确保它们是多线程安全的 并发类加载。

  4. 他们还补充说: 如果您的自定义类加载器仅覆盖findClass(String),则不需要进一步更改。这是创建自定义类加载器的推荐机制。