防止在不锁定整个键值集中并发更新一条记录的最佳方法是什么?从语义上讲,我正在寻找一种通过键进行锁定的方法(理想情况下是Java实现,但不一定):
interface LockByKey { void lock(String key); // acquire an exclusive lock for a key void unlock(String key); // release lock for a key }
此锁用于同步对远程存储的访问,因此不能选择某些同步的Java集合。
番石榴在13.0中发布了类似的内容。您可以根据需要将其从HEAD中取出。
Striped<Lock>或多或少分配特定数量的锁,然后根据其哈希码将字符串分配给锁。该API或多或少看起来像
Striped<Lock>
Striped<Lock> locks = Striped.lock(stripes); Lock l = locks.get(string); l.lock(); try { // do stuff } finally { l.unlock(); }
可控的条带数量或多或少可让您以内存使用为代价来交换并发性,因为为每个字符串键分配一个完整的锁可能会变得很昂贵。从本质上讲,只有在发生(可预测的)罕见的哈希冲突时,您才会获得锁争用。
(披露:我为番石榴做出了贡献。)