ImageIO线程安全

时间:2014-10-10 10:38:53

标签: java javax.imageio

我在javax.imageio规范中看到线程安全不是目标,尽管我已经看到了使用ImageIO.read()ImageIO.write()上传/清理图像的几个示例网络环境。

所以,我的问题是,尽管规范说的是,ImageIO是线程安全的吗?

2 个答案:

答案 0 :(得分:5)

TLDR;是的,静态方法ImageIO.read(...)write(...)是线程安全的。


需要在上下文中阅读说明"thread safety is not a goal"的规范部分。实际上说的是,单个ImageReaderImageWriterImageInputStream/ImageOutputStream实现不需要关心线程安全(因此,客户端代码永远不应该假设它们是线程安全)。只要你遵守这条规则,你就是安全的。但请注意,规范的相同部分还指出:

  

[...]同一个插件类的多个实例必须能够同时运行。

本部分规范并未讨论ImageIO的静态方法,但上述引文暗示tese方法是线程安全的,因为ImageIO.read(...)write(...)创建新的实例每次调用都需要ImageInputStream / ImageOutputStreamImageReader / ImageWriter。所以,它不是真的"尽管规范说的是"

ImageIO类由几个可以安全使用的静态方法组成,类本身(大多数是*)是无状态的。如果它没有以这种方式工作,它就没有多大用处...

*)IIORegistry ImageIO实例在类创建时填充,并在调用scanForPlugins()方法时重新初始化。如果两个线程同时调用它,您可能会遇到问题(即插件可能没有正确注册),但是当客户端代码控制它发生的地方/时间时,您可以轻松避免这种情况。还有每个线程组CacheInfo,但它的用法似乎正确同步。


免责声明,我没有编写规范,但这是我的解释(我在无数的多线程应用程序中使用了ImageIO,并编写了十几个ImageReader和我自己ImageWriter插件。

答案 1 :(得分:-1)

我检查了班级,没有州和几乎所有无国籍的班级。 (我没有检查所有功能。最好在使用前检查功能)

最有可能是线程安全。