gpt4 book ai didi

java - setContextClassLoader 在并发调用时速度急剧下降

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:58:51 26 4
gpt4 key购买 nike

我在我的应用程序中指出了一个瓶颈,在我看来它归结为对 Thread::setContextClassLoader 的调用.

基本上,由于第 3 方库的问题,我被迫摆弄线程的上下文类加载器(请参阅 this question 了解原因)。

据我所知,我选择的解决方案是最常见的解决方案,它的工作原理如下:

Thread thread = Thread.currentThread();
ClassLoader old = thread.getContextClassLoader();
thread.setContextClassLoader(newClassLoader);

try {
... // problematic code that uses the thread context class loader
} finally {
thread.setContextClassLoader(old);
}

事实证明,当只有 1 个线程在运行时,对 setContextClassLoader 的调用不是问题,但当有多个线程在运行时,速度会急剧下降。

我制作了以下测试应用程序来隔离问题:

ArrayList<Thread> threads = new ArrayList<Thread>();
int thread_count = 1;

long start = System.currentTimeMillis();

for (int i = 0; i < thread_count; i++) {
Thread thread = new Thread(new MyRunnable(100000000));

thread.start();
threads.add(thread);
}

for (Thread thread : threads) {
thread.join();
}

long total = System.currentTimeMillis() - start;
double seconds = (double)total / 1000;

System.out.println("time in seconds: " + seconds);

这是 MyRunnable 类:

public class MyRunnable implements Runnable {
int _iterations;

public MyRunnable(int iterations) {
_iterations = iterations;
}

public void run() {
final Thread curr = Thread.currentThread();
final ClassLoader loader = ClassLoader.getSystemClassLoader();

for (int i = 0; i < _iterations; i++) {
curr.setContextClassLoader(loader);
}
}
}

基本上它会打开几个线程,并在循环中将当前线程上下文类加载器设置为系统类加载器。

在我的机器上更改代码后的更新结果:当 thread_count 为 1 时,它会在半秒内完成。 2 个线程占用 1.5~,3 个线程占用 2.7~,4 个线程占用 4~ - 你明白了吧。

我已经尝试查看 Thread 的 setContextClassLoader 实现,看起来它所做的只是将一个成员变量设置为传递给它的类加载器。当使用多个线程运行时,我发现没有锁定(或访问所需的共享资源)来解释这种开销。

我在这里错过了什么?

附言我使用的是 JRE 1.5,但同样的事情发生在 1.6 中。

编辑: @Tom Hawtin - 查看我为排除您提到的原因所做的代码更改。即使获取系统类加载器一次,当线程数 > 1 时,结果也会变慢。

最佳答案

源代码中唯一真正明显的事情与Thread.setContextClassLoader 无关。 ClassLoader.getSystemClassLoader 调用锁定 ClassLoader.classinitSystemClassLoader,即使系统类加载器已经初始化。

一个潜在的问题是读取 volatile 变量可能会对某些多处理器机器的性能产生影响。

请注意,我们在这里只查看几百个周期。

关于java - setContextClassLoader 在并发调用时速度急剧下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2000586/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com