java - ImageIO.write被多线程调用,安全吗?

标签 java multithreading javax.imageio

我对 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/

相关文章:

java - 使用 URL 或文件(在 ImageIO.read 中)

java - RESTful 服务器应如何将用户提交的图像保存到文件中?

java - 尝试返回 2 个 boolean 值 Java

Java-PLSQL-从java调用记录表

java - 返回 sqlite 数据库中列的名称

python - PySide 将信号从 QThread 传递到另一个 QThread 中的插槽

java - ScheduledExecutorService 只循环一次

java - akka - 如何获得多个 Actor 的结果?

java - 在带有实例变量的 block 上使用 synchronized

Java 未知来源与 ImageIO