我有一个BufferedImage实例的集合,一个主图像和一些通过在主图像上调用getSubImage创建的子图像.子图像不重叠.我也在修改子图像,我想把它分成多个线程,每个子图像一个.
根据我对BufferedImage,Raster和DataBuffer如何工作的理解,这应该是安全的,因为:
>只从一个线程访问BufferedImage的每个实例(及其相应的WritableRaster和SampleModel).
>共享的ColorModel是不可变的
> DataBuffer没有可以修改的字段(唯一可以改变的是支持数组的元素.)
>在单独的线程中修改数组的不相交段是安全的.
但是我在文档中找不到任何说明这样做绝对安全的内容.我可以认为它是安全的吗?我知道可以处理子Rets的副本,但我更愿意避免这种情况,因为内存限制.
否则,是否可以在不复制父图像区域的情况下使操作成为线程安全的?
最佳答案:
您是否考虑过使用JAI来管理“子图像”作为图块?如果你不必挂起原始图像BufferedImage实例以及它的所有subImage BufferedImage实例,它似乎更好地利用了资源.有关JAI的信息可以在这里找到:
JAI README
有一个类TiledImage,它实现了RenderedImage接口(给它一个带BufferedImage的共同祖先).根据JAI文件:
The use of tiling also facilitates the
use of multiple threads for
computation. Previously allocated
tiles may also be re-used to save
memory.
无论如何,使用RenderedImage的这些实现之一通常更喜欢BufferedImage,因为BufferedImage在内存中为整个图像维护一个图像快照. JAI使用渲染链,可以根据需要回收切片以适应内存约束.