【问题标题】:Java: multithreading on massive data: sharing data between threads?Java:海量数据上的多线程:线程之间共享数据?
【发布时间】:2014-10-17 13:34:05
【问题描述】:

我想在海量数据上运行多线程程序。我通常创建一个可调用(或可运行)的类,并将进程所需的数据传递给该类。

public class CallableTrainer implements Callable<PredictorResult> {

   dataType data;

   CallableTrainer( dataType massiveData ) { 
       this.data = massiveData;
   }

   @Override
   public PredictorResult call() throws Exception {
        // do something and return ... 
   }
}

基于上述实现,我假设总是为每个线程复制“massiveData”(对吗?)如果这是真的,我为每个线程复制这些数据会浪费大量内存。有没有办法在线程之间共享数据?

【问题讨论】:

  • 取决于dataType 是什么。如果它不是原始类型,则它是一个引用,因此不会被复制。您需要确保无论 dataType 是什么,在访问/修改其底层数据时都是线程安全的。

标签: java multithreading thread-safety threadpool


【解决方案1】:

我假设总是为每个线程复制“massiveData”(对吗?)如果这是真的......

不,错误。仅复制对 massiveData 的引用。

Java 不会对非原始类型进行魔术复制。如果你想复制一些东西,你必须明确地这样做。

如果您还不知道这一点,我猜您在编写此多线程代码时会遇到各种其他问题。例如,除非这些线程只是读取massiveData,那么您真的需要对您所做的任何更新进行某种同步或原子性保证,否则你会得到垃圾。

这是一本关于该主题的好书(带有 Java 示例):The Art of Multiprocessor Programming

【讨论】:

  • @eldjon - 我所说的“魔术复制”是指像 C++ 这样的语言如何在赋值时为对象隐式调用复制构造函数,而在 Java 中赋值只会复制引用和原始值。
猜你喜欢
  • 1970-01-01
  • 2011-07-08
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 2019-04-08
相关资源
最近更新 更多