ImageIO 线程安全 [英] ImageIO thread-safety

查看:95
本文介绍了ImageIO 线程安全的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I see in the javax.imageio spec that thread-safety is not a goal, despite I've seen several examples using ImageIO.read() and ImageIO.write() for uploading/sanitizing images in a web environment.

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

So, my question is, despite what the spec says, is ImageIO thread-safe?

推荐答案

ImageIO 不是线程安全的(或者至少其中一个插件不是),至少在我的一个环境中.我正在调试一个问题,当从多个线程调用 ImageIO.read() 时,png 和 jpg 文件无法正确加载(有时是纯灰色,有时是反转颜色,有时是随机颜色等).我也偶尔会得到 ConcurrentModificationExceptions 像:

ImageIO is not thread safe (or at least one of it's plugins is not), in at least one of my environments. I am in the process of debugging an issue where png and jpg files don't get loaded correctly (sometimes solid gray, sometimes inverted colors, sometimes random colors, etc) when ImageIO.read() is invoked from multiple threads. I also occasionally get ConcurrentModificationExceptions like:

java.util.ConcurrentModificationException
at java.util.Vector$Itr.checkForComodification(Vector.java:1184)
at java.util.Vector$Itr.next(Vector.java:1137)
at sun.java2d.cmm.ProfileDeferralMgr.activateProfiles(ProfileDeferralMgr.java:93)
at java.awt.color.ICC_Profile.getInstance(ICC_Profile.java:777)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.setImageData(JPEGImageReader.java:657)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImageHeader(Native Method)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readNativeHeader(JPEGImageReader.java:609)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.checkTablesOnly(JPEGImageReader.java:347)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.gotoImage(JPEGImageReader.java:481)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readHeader(JPEGImageReader.java:602)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1059)
at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:1039)
at javax.imageio.ImageIO.read(ImageIO.java:1448)
at javax.imageio.ImageIO.read(ImageIO.java:1308)
at com.foo.bar.MyTestLoadThread.loadImage(MyTestLoadThread.java:241)
...
at java.lang.Thread.run(Thread.java:745)

我无法在所有环境中复制此行为,因此它可能是特定于 JVM 的.但这里是环境的详细信息.我看到它失败的地方:

I am not able to replicate this behavior in all environments so it may be JVM specific. But here are the details of the env. where I see it fail:

  • 操作系统:Ubuntu 14.04
  • java -version :
    java版本1.8.0_33"
    Java(TM) SE 运行时环境(构建 1.8.0_33-b05)
    Java HotSpot(TM) 客户端 VM(构建 25.33-b05,混合模式)

这篇关于ImageIO 线程安全的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆