我可以調用的方法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(...)
方法是一個原子操作。這並不能讓您免於調用重命名的第二個線程將刪除第1個線程的輸出,但它可以幫助您免受損壞的圖像。
我懷疑這是,但我不確定。一種常用的技術是寫入tmp位置,然後將其移動到您想要的位置 - 這通常是原子性的,或者像您要在給定的文件系統上那樣原子化。 – yshavit
假設你不試圖寫入同一個文件 - 我不明白爲什麼這不會是線程安全的。 –
啊,是的。我正在假設寫入同一個文件。 OP,你能澄清嗎? – yshavit