【发布时间】:2013-05-13 11:36:29
【问题描述】:
我正在尝试为以下场景创建细粒度锁定机制:
我有一个数据存储,其中包含许多序列化的Cache 对象。每个Cache 属于某个人、组或公司,每个Cache 可以通过以下四种方式之一进行修改:可以创建、删除、删除或插入。在修改 Cache 时,我想阻止对它的访问。每个Cache 都使用CacheLocation 对象标识,该对象存储目录和文件名以及完整路径以方便使用。
目前我在一个名为RequestQueue 的类中使用一个数组列表,该类包含当前正在处理的CacheLocation 对象。然后,当另一个线程进入时,它会检查队列以查看它所请求的CacheLocation 是否已被使用。如果是这种情况,则使用 while 循环定期检查 CacheLocation,直到将其放在那里的请求将其删除。
我在想,有一个 CacheLocation 键对 BlockingQueue 值的 HashMap 可能是一个想法。这会产生大量 BlockingQueue 对象,但我可以很好地管理队列。
有没有更好的方法来进行这种细粒度锁定?
【问题讨论】:
-
不要使用 while 循环来等待资源。两个或多个线程可以同时具有条件为真并中断序列化访问。相反,使用同步或锁定
-
我以前试过这个,但可能弄错了。我在 RequestMap 上调用 get 以查看请求 CacheLocation 是否在 Map 中(认为我需要使用 ConcurrentHashMap),如果 get 返回了一个我正在同步并在对象上调用 wait 的位置。我遇到的问题是从另一个线程调用通知导致 IllegalMonitorStateException。不知道为什么,因为其他线程应该已经创建了对象,但它需要更多的研究:)
标签: java concurrency locking request-queueing