gpt4 book ai didi

java - Java中同步访问资源(Spring MVC)

转载 作者:太空宇宙 更新时间:2023-11-04 08:15:28 25 4
gpt4 key购买 nike

我编写了一项服务来为用户在我的网站上动态上传的图像生成缩略图。这是它的工作原理:

获取缩略图:

  1. 检查此缩略图是否已被请求过
  2. 如果没有,请将原始图像调整为请求的大小并将其缓存在硬盘上
  3. 返回硬盘上缓存的缩略图

上传另一张图片:

  1. 检查此图片之前是否上传过(例如,用户可能正在更新其个人资料图片,可以删除旧的图片)
  2. 如果是,则删除旧图片的所有缩略图
  3. 保存/覆盖新上传的图片

问题出在第 2 点上,当用户请求缩略图时。如果两个用户同时请求相同的缩略图并且之前未调整过大小怎么办?这两个请求都会告诉服务器调整原始图片的大小并将其保存在硬盘上。 两个请求都会尝试同时在硬盘驱动器上写入相同的文件,从而导致明显的访问问题。

如何在 Spring MVC 中避免这种冲突?所有这些缩略图逻辑都在 Spring Controller 内进行管理,如下所示:

@RequestMapping("/images/{width:\\d{1,10}}x{height:\\d{1,10}}/{subject:.+}.{ext:png|gif|jpg|PNG|GIF|JPG}")
public void thumbnail(HttpServletResponse response,
HttpServletRequest request,
@PathVariable("width") int width,
@PathVariable("height") int height,
@PathVariable("subject") String subject,
@PathVariable("ext") String ext) throws IOException
{
// ...
}

最佳答案

  • 检查文件是否存在。

  • 如果文件不存在:

    • 创建一个 ReentrantLock,并使用 putIfAbsent() 方法将其存储在 ConcurrentHashMap 中,以文件路径为键。

    • 如果putIfAbsent()返回一个锁,则在下面使用这个锁。否则,使用您创建并存储在 map 中的锁。

    • 获取ReentrantLock上的锁。

    • 获得锁定后,检查文件是否存在。如果没有,请创建它。否则,您无需执行任何操作,因为并发线程之前创建了它。

    • 释放锁并将其从映射中删除(在finally block 中)。

  • 读取文件并返回其内容。

关于java - Java中同步访问资源(Spring MVC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10514170/

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