一尘不染

如何通过钥匙获取锁

algorithm

防止在不锁定整个键值集中并发更新一条记录的最佳方法是什么?从语义上讲,我正在寻找一种通过键进行锁定的方法(理想情况下是Java实现,但不一定):

interface LockByKey {
   void lock(String key); // acquire an exclusive lock for a key   
   void unlock(String key); // release lock for a key
}

此锁用于同步对远程存储的访问,因此不能选择某些同步的Java集合。


阅读 229

收藏
2020-07-28

共1个答案

一尘不染

番石榴在13.0中发布了类似的内容。您可以根据需要将其从HEAD中取出。

Striped<Lock>或多或少分配特定数量的锁,然后根据其哈希码将字符串分配给锁。该API或多或少看起来像

Striped<Lock> locks = Striped.lock(stripes);
Lock l = locks.get(string);
l.lock();
try {
  // do stuff 
} finally {
  l.unlock();
}

可控的条带数量或多或少可让您以内存使用为代价来交换并发性,因为为每个字符串键分配一个完整的锁可能会变得很昂贵。从本质上讲,只有在发生(可预测的)罕见的哈希冲突时,您才会获得锁争用。

(披露:我为番石榴做出了贡献。)

2020-07-28