GUAVA库中的条带锁的全局锁定

时间:2018-12-05 17:09:00

标签: java concurrency locking

我在项目中使用了GUAVA的条纹锁,用于同步过程的每个唯一标识符的输入数据,它为下一步处理此数据提供了正确的数据顺序。

Striped<Lock> locks = Striped.lazyWeakLock(10);
public void put(String id, String data) {
    Lock lock = locks.get(id);
    lock.lock()
    try {
     // process data
    } finally {
       lock.unlock()
    }
}

此代码可以正常工作,提供正确的数据顺序。 但是我想获得对当前对象的全局锁定(独占访问)以修改某些数据。因此,在修改数据之前,我想停止获取所有唯一ID的锁。

可能的解决方案:

  1. 我可以在获取条带化锁之前使用ReasWriteLock。 (读-为“ locks.get(id)”,写-为独占访问)-不好的解决方案,在正常状态下需要额外锁定。
  2. 我可以全部使用一个锁,但这会降低应用程序的速度
  3. 全局锁定

示例:

if (locked) {
    global.lock()
    global.unlock()
    Lock lock = locks.get(id);
    ...
} else {
    Lock lock = locks.get(id);
    if (locked){
       ...
    }
    lock.lock();
}

void extraLock(){
   global.lock();
   locked = true;
   // modify data
   locked = false;
   global.unlock()
}

我认为具有全局锁定的解决方案看起来不太好(标志,锁定,仔细检查等)

问题: 您能提出任何可以帮助我解决此问题的解决方案吗? 还是你能说出一些主意吗?

谢谢

0 个答案:

没有答案