【问题标题】:How to fill a byte array from multiple threads safely?如何安全地从多个线程填充字节数组?
【发布时间】:2009-09-04 11:30:04
【问题描述】:

有没有一种方法可以安全地从多个线程填充字节数组(例如,第一个线程填充前半部分,第二个线程使用 System.arraycopy 填充后半部分)而不使用 Java 6 或 7 在数组本身上进行同步? jsr166相关库只包含int数组(AtomicIntegerArray、ParallelIntegerArray)。

【问题讨论】:

  • 感谢您提出这个问题!我从没想过要读写一个多线程的数组。这对我的服务器端世界生成器和处理器肯定会有所帮助!我也可以在客户端初始加载时拆分图像状态的计算!为了速度,我已经将平面数组用作多维数组,但是这个 ^.^.

标签: java multithreading bytearray


【解决方案1】:

是的,它有效。写入数组位置不会干扰附近的位置。但是,您需要确保所有线程在读取之前都已完成(发生前的关系)。您使用数组这一事实没有任何区别。

【讨论】:

  • 是的,连接以 Future.get() 的形式存在。我担心缓存对齐。例如,用 4096+4096 编写的 [8192] 数组可能正常工作,但 4095+4097 可能不行?
  • 好像行得通,至少数据的MD5一直保持不变。谢谢。
  • 与使用非原子字节操作写入字节相比,这是否会使 Java 字节数组在单线程访问中变得相当慢?我的意思是,假设 JIT 或 arraycopy 实现已将任何边界检查移到循环之外。
  • onebyone:不是真的。有一些优化无法完成。例如,您无法通过一次 32/64 位读取读取多个字节,更改其中的一两个字节并将整个内容写回。在多线程、多处理器场景中,访问数组附近元素的性能可能会很差。
  • 我不反对多核情况下的放缓,因为您只需为所使用的内容付费。我有点惊讶的是,无论 JIT 实际发出什么指令以原子方式修改单个字节,如果要删除原子性要求,就无法改善。或者,如果它们可以在给定的 CPU 上得到改进,那么 JIT 在单线程情况下注意到不需要原子性并使用非原子操作,从而避免为某些东西付费,这让我印象深刻。正在使用。
【解决方案2】:

哦,这听起来是个让人头疼的好方法。 :) 我想我会为每个线程选择一个数组,然后加入它们。

【讨论】:

  • 我试过这个选项,但我很不满意。我想试试多线程选项。
  • 但我的建议是保留线程,每个线程只有一个数组,以避免冲突。你不满意的原因是什么?性能?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多