ImageIO.write由多个线程调用,是否安全?

时间:2017-05-22 18:21:08

标签: java multithreading javax.imageio

我对javax.imageio包中的ImageIO类的 write 方法有疑问 我可以打电话给方法 ImageIO.write(bufferedImage, 'jpg', new File(...))
 与bufferedImage每个线程的不同实例
所以我想知道它的线程是否安全在我的情况下。为什么这个方法可以是线程安全的。提前谢谢!

编辑:@yshavit,是的,是为了写入不同的文件
对于我读过的另一个帖子,但是我并不十分清楚为什么它可以确保线程安全,因为 haraldK 说。

1 个答案:

答案 0 :(得分:1)

  

我可以调用方法ImageIO.write(bufferedImage, 'jpg', new File(...)) ...   我想知道它是否是线程安全的......

听起来你试图在不同ImageIO.write(...)的多个帖子中调用bufferedImage,并写入同一个File。就代码是"线程安全而言,这不会成为一个问题。通过使用不同的bufferedImage从不同的线程调用,不会出现内存覆盖问题或我们通常担心线程的其他问题。

但是,存在可能生成无效图像文件的竞争条件。在查看FileImageOutputStream时,如果2个线程同时写入同一个RandomAccessFile,您当然可以获得由一个线程写入的文件的部分,而另一个线程写入的其他部分导致破碎的图像。

我建议每个线程写入自己的临时文件,然后将文件重命名到位:

// write to temporary file with thread-id suffix
File tempFile =
     new File(destinationDirectory + fileName + Thread.currentThread().getId() + ".t");
ImageIO.write(bufferedImage, 'jpg', tempFile);
// rename into place
tempFile.rename(new File(fileName));

File.rename(...)方法原子操作。它不能避免这样一个事实,即调用重命名的第二个线程将删除第一个线程的输出,但它会使您免于损坏的图像。