Java:海量数据的多线程:在线程之间共享数据?

Dan*_*iel 1 java multithreading thread-safety threadpool

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

public class CallableTrainer implements Callable<PredictorResult> {

   dataType data;

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

   @Override
   public PredictorResult call() throws Exception {
        // do something and return ... 
   }
}
Run Code Online (Sandbox Code Playgroud)

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

Dao*_*Wen 6

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

不,不.仅massiveData复制引用.

Java不会做非原始类型的魔术副本.如果你想复制一些东西,你必须明确地做.

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

这是一本关于该主题的好书(使用Java示例):多处理器编程的艺术