可以安全地在单独的线程中更新BufferedImage的单独区域吗?

fin*_*nnw 5 java multithreading bufferedimage thread-safety

我有一组BufferedImage实例,一个主图像和一些通过调用getSubImage主图像创建的子图像.子图像不重叠.我也在修改子图像,我想把它分成多个线程,每个子图像一个.

从我的理解如何BufferedImage,RasterDataBuffer工作,这应该是安全的,因为:

  • 仅从一个线程访问BufferedImage(及其各自WritableRasterSampleModel)的每个实例.
  • 共享ColorModel是不可变的
  • DataBuffer不具有字段可被修改(即可以改变是所述背衬阵列的元件的唯一的东西.)
  • 在单独的线程中修改数组的不相交段是安全的.

但是我在文档中找不到任何说明这样做绝对安全的内容.我可以认为它是安全的吗?我知道有可能处理孩子Raster的副本,但我宁愿避免这种情况,因为内存限制.

否则,是否可以在不复制父图像区域的情况下使操作成为线程安全的?

Jef*_*eff 4

您是否考虑过使用 JAI 将“子图像”作为图块进行管理?如果您不必保留原始图像 BufferedImage 实例及其所有子图像 BufferedImage 实例,这似乎可以更好地利用资源。有关 JAI 的信息可以在这里找到: JAI README

有一个类 TiledImage,它实现了 RenderedImage 接口(使其与 BufferedImage 具有共同的祖先)。根据 JAI 文档:

平铺的使用还方便了使用多线程进行计算。先前分配的图块也可以重新使用以节省内存。

无论如何,使用 RenderedImage 的这些实现之一通常比 BufferedImage 更可取,因为 BufferedImage 在内存中维护整个图像的图像快照。JAI 使用渲染链,可以根据需要回收图块以适应内存限制。