我在javax.imageio
规范中看到线程安全不是目标,尽管我已经看到了使用ImageIO.read()
和ImageIO.write()
上传/清理图像的几个示例网络环境。
所以,我的问题是,尽管规范说的是,ImageIO
是线程安全的吗?
答案 0 :(得分:5)
TLDR;是的,静态方法ImageIO.read(...)
和write(...)
是线程安全的。
需要在上下文中阅读说明"thread safety is not a goal"的规范部分。实际上说的是,单个ImageReader
,ImageWriter
或ImageInputStream/ImageOutputStream
实现不需要关心线程安全(因此,客户端代码永远不应该假设它们是线程安全)。只要你遵守这条规则,你就是安全的。但请注意,规范的相同部分还指出:
[...]同一个插件类的多个实例必须能够同时运行。
本部分规范并未讨论ImageIO
的静态方法,但上述引文暗示tese方法是线程安全的,因为ImageIO.read(...)
和write(...)
创建新的实例每次调用都需要ImageInputStream
/ ImageOutputStream
和ImageReader
/ ImageWriter
。所以,它不是真的"尽管规范说的是" 。
ImageIO
类由几个可以安全使用的静态方法组成,类本身(大多数是*)是无状态的。如果它没有以这种方式工作,它就没有多大用处...
*)IIORegistry
ImageIO
实例在类创建时填充,并在调用scanForPlugins()
方法时重新初始化。如果两个线程同时调用它,您可能会遇到问题(即插件可能没有正确注册),但是当客户端代码控制它发生的地方/时间时,您可以轻松避免这种情况。还有每个线程组CacheInfo
,但它的用法似乎正确同步。
免责声明,我没有编写规范,但这是我的解释(我在无数的多线程应用程序中使用了ImageIO
,并编写了十几个ImageReader
和我自己ImageWriter
插件。
答案 1 :(得分:-1)
我检查了班级,没有州和几乎所有无国籍的班级。 (我没有检查所有功能。最好在使用前检查功能)
最有可能是线程安全。