gpt4 book ai didi

java - ImageIO 已同步

转载 作者:搜寻专家 更新时间:2023-10-31 19:56:00 24 4
gpt4 key购买 nike

我有一个网络应用程序,用户可以在其中上传图片。我们通过 ImageIO.read() 验证图像数据,并在将结果保存到磁盘之前对生成的 BufferedImage 执行一些简单的转换。

在执行负载测试时,我们意识到当许多请求同时进入时,它们会在 ImageIO.read() 调用中被阻塞。深入挖掘,我们注意到 JPEGImageReader 是同步的,并且一次只创建一个 BufferedImage。

有没有人遇到过这个?我已经用谷歌搜索了几天了,还没有遇到遇到这个问题的其他人,所以也许我做错了什么。我想不出任何合乎逻辑的理由。这似乎与无法为某些内存泄漏问题为每个图像创建单独的读取器和写入器有关,但这种解释对我来说似乎相当薄弱。

编辑:Here是一种性能工具,可以分解花费这么长时间的内容。我相信这是由于所有线程都在等待同步锁,JPEGImageReader来源。

编辑:JAI 库本来可以工作,除非 OpenJDK 删除了对它的关键部分的支持,明确地是 JPEG 编解码器。

解决方案:考虑到我花了很多时间尝试寻找替代解决方案但没有成功,我最好的解决方案是根据请求异步处理图像。因此,当请求到来时,原始图像数据被存储为假定的有效图像;然后,请求线程之外的异步进程将一次处理每个图像。 由于 ImageIO 库的同步性,尝试一次执行多个操作没有任何好处。如果库不是同步的,则图像可以并行处理,只是效率低下。

虽然异步处理会增加一定程度的复杂性,但对于修改图像而言,这可能是个好主意。不起作用的是我们无法处理每个请求中的原始图像,这意味着我们的系统必须假设每个图像都是有效的图像数据。当异步处理器开始处理图像时,如果数据不正确,系统可能会出现不一致。

最佳答案

编辑:首先,haraldK 的回答是正确的,而我原来的回答是错误的。然而,它不能被删除,只有编辑 OP 才能重新分配勾号。

ThreadLock 机制用于阻止线程从自己的读取器访问不同的读取器,而不是阻止线程独立于其他线程或与其他线程同时访问自己的读取器。

因此 ImageIO 的 JPEGImageReader 应该可以很好地异步工作。

关于java - ImageIO 已同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17933499/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com