gpt4 book ai didi

java - 如何使用读写锁?

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

我是以下情况。

在 web 应用程序启动时,我需要加载一个 map ,此后由多个传入线程使用。也就是说,收到请求并使用 Map 来查明它是否包含特定键,如果包含,则检索值(对象)并将其关联到另一个对象。

现在, map 的内容有时会发生变化。我不想重新启动我的应用程序以重新加载新情况。相反,我想动态地执行此操作。

但是,在 map 重新加载时(删除所有项目并用新项目替换它们),该 map 上的并发读取请求仍然到达。

我应该怎么做才能防止所有读取线程在重新加载时访问该 Map?我怎样才能以最高效的方式执行此操作,因为我只在 map 重新加载时才需要它,而这只会偶尔发生(每 x 周一次)?

如果以上不是一个选项(阻塞),我如何确保在重新加载我的读取请求时不会遇到意外异常(因为键不再存在,或者值不再存在或正在重新加载)?

我得到的建议是 ReadWriteLock 可能会帮助我。你能给我一个例子,说明我应该如何与我的读者和作者一起使用这个 ReadWriteLock 吗?

谢谢,
E

最佳答案

我建议按如下方式处理:

  1. 让您的 map 在中央位置可访问(可以是 Spring 单例、静态...)。
  2. 开始重新加载时,让实例保持原样,在不同的 Map 实例中工作。
  3. 当新 map 填满后,用新 map 替换旧 map (这是一个原子操作)。

示例代码:

    static volatile Map<U, V> map = ....;

// **************************

Map<U, V> tempMap = new ...;
load(tempMap);
map = tempMap;

并发效果:

  • volatile 有助于变量对其他线程的可见性。
  • 在重新加载 map 时,所有其他线程看到旧值不受干扰,因此它们不会受到任何惩罚。
  • 任何在更改之前立即检索 map 的线程都将使用旧值。
    • 它可以请求多个 gets 到同一个旧 map 实例,这对于数据一致性非常有用(不会从旧 map 加载第一个值,然后从新 map 加载其他值)。
    • 它将完成对旧 map 的请求处理,但下一个请求将再次询问 map ,并将接收更新的值。

关于java - 如何使用读写锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1643428/

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