我对 javax.imageio 包中 ImageIO 类的方法write有疑问
我可以调用该方法
ImageIO.write(bufferedImage, 'jpg', new File(...))
每个线程使用 bufferedImage 不同的实例
所以我想知道在我的情况下它是否是线程安全的。以及为什么这个方法可以是线程安全的。提前致谢!
编辑:@yshavit,是的,这是为了写入不同的文件
对于另一个线程,我读了它,但我不太明白为什么它可以像 haraldK 所说的那样肯定是线程安全的。
最佳答案
Can i call the method
ImageIO.write(bufferedImage, 'jpg', new File(...))
... I want to know if it's thread safe...
听起来您正在尝试在多个线程中使用不同的 bufferedImage
调用 ImageIO.write(...)
,所有这些都写入同一个 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(...)
方法是一个原子操作。它不会让您免受调用重命名的第二个线程将删除第一个线程的输出的事实,但它可以使您免受损坏的图像的影响。
关于java - ImageIO.write被多线程调用,安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44119617/