java - 创建新线程时,每个单独的线程是否都会创建自己的 run() 方法中定义的对象/methods() 副本?

标签 java multithreading synchronization

所以我正在观看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/

相关文章:

java - Tomcat 6 类加载器 : Which Jar is it reading?

java - android.system.ErrnoException 错误

java - slf4j 日志记录问题 - 未生成日志文件

c# - 跨线程操作无效 : Control accessed from a thread other than the thread it was created on

java - JSP 页面未向我的数据库添加值

c - 关于用多线程实现 sleep 理发师时的同步

java - 如何测量分布式系统中的请求时间?

java - java中同步块(synchronized block)的部分执行

c - 是否有必要使 pthread_mutex_t 变量可变?

javascript - 处理ajax同步?