0

我正在尝试为以下场景创建细粒度锁定机制:

我有一个数据存储,其中包含许多序列化Cache对象。每个都Cache属于特定的个人、团体或公司,每个Cache都可以通过以下四种方式之一进行修改:可以创建、删除、删除或插入。在Cache修改 a 时,我想阻止对它的访问。每个Cache都使用一个对象来标识,该CacheLocation对象存储目录和文件名以及为方便起见的完整路径。

目前我在一个名为的类中使用一个数组列表,该类RequestQueue包含正在处理的当前CacheLocation对象。然后,当另一个线程进入时,它会检查队列以查看CacheLocation它正在请求的是否已被使用。如果是这种情况,则使用 while 循环CacheLocation定期检查,直到将其放在那里的请求将其删除。

我在想拥有一个针对值的CacheLocation键的 HashMap 可能是一个想法。BlockingQueue这会产生大量BlockingQueue对象,但我可以很好地管理队列。

有没有更好的方法来进行这种细粒度锁定?

4

2 回答 2

1

如果我正确理解了您的描述,那么使您的设计保持相当简单的一种方法是:

  • 使用 aConcurrentHashMap<CacheLocation, Cache>来存储缓存(我假设CacheLocations 是不可变的,或者至少从不变异)
  • 确保通过锁定相关CacheLocation对象来保护对缓存的所有访问
于 2013-05-13T11:44:03.667 回答
0

还有另一种非阻塞(但可能更慢)的方法:

map.compute(someId, (key, value) -> {
  // atomic access to cache
  return null;
});

在这里阅读我的相关问题和答案

于 2016-09-24T17:55:23.720 回答