所以我正在观看java中的多线程教程,在教程中创建了一个扩展Thread类的类,并重写了run()方法,在run方法中调用了threadCountdown
对象doCountDown()
方法示例:
class CountdownThread extends Thread{
private Countdown threadCountdown;
public CountdownThread(Countdown countdown){
threadCountdown = countdown;
}
public void run(){
threadCountdown.doCountdown();
}
}
我的问题是,每次从上面的代码创建一个新线程时,都会为 run() 方法中调用的内容创建一个单独的副本,例如在上面的代码中,当创建一个新线程时,是否会为 threadCountdown.doCountdown()
方法创建一个单独的副本?如果是这样,那么整个对象也可以被“复制”以供线程使用吗?
最佳答案
在上面的代码片段中,所有生成的线程将共享堆中存在的同一对象。
<小时/>可能会出现这样的情况,在并发环境中,多个线程可能运行在不同的CPU(CPU核心)上,并且为了更快地执行,它们可能更愿意将对象保留在CPU缓存中而不是从主内存中读取它。 最终,这将引发其他并发问题。
要让线程创建单独的副本,请切换到使用 ThreadLocal 变量。
关于java - 创建新线程时,每个单独的线程是否都会创建自己的 run() 方法中定义的对象/methods() 副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59134330/