Java:对请求进行细粒度锁定?

时间:2013-05-13 11:36:29

标签: java concurrency locking request-queueing

我正在尝试为以下场景创建一个精细的粒子锁定机制:

我有一个数据存储区,里面有许多序列化的Cache个对象。每个Cache属于某个人,组或公司,每个Cache可以通过以下四种方式之一进行修改:可以创建,删除,删除或插入。Cache。正在修改Cache时我想阻止对它的访问。每个CacheLocation都使用RequestQueue对象进行标识,该对象存储目录和文件名以及方便的完整路径。

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

我在想,根据BlockingQueue值设置BlockingQueue密钥的HashMap可能是个主意。这会产生大量{{1}}个对象,但我可以很好地管理队列。

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

2 个答案:

答案 0 :(得分:1)

如果我理解你的描述正确,那么让你的设计相当简单的一种方法是:

  • 使用ConcurrentHashMap<CacheLocation, Cache>来存储缓存(我假设CacheLocation是不可变的,或者至少从不变异)
  • 确保通过锁定相关的CacheLocation对象
  • 来保护对缓存的所有访问

答案 1 :(得分:0)

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

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

阅读here我的相关问题和答案