代码之家  ›  专栏  ›  技术社区  ›  Serhii

灵活的锁定选择(选择性锁定)

  •  1
  • Serhii  · 技术社区  · 6 年前

    我需要解决具有不同内存位置的相等对象的情况(因为多线程而发生在REST请求中)。

    private Map<T, ReentrantLock> lockHolder = new HashMap();
    
    void unLock(T monitorMarker) {
        synchronized (lockHolder) {
            ReentrantLock lock = lockHolder.get(monitorMarker);
            if (lock == null || lock.getHoldCount() == 0) {
                return;
            }
            lock.unlock();
            if (lock.getHoldCount() == 0) {
                lockHolder.remove(monitorMarker);
            }
        }
    }
    
    ReentrantLock getLockForCalendar(T monitorMarker) {
        synchronized(monitorMarker) {
            ReentrantLock lock = lockHolder.get(monitorMarker);
            if (lock == null) {
                lock = new ReentrantLock();
                lockHolder.put(monitorMarker, lock);
            }
            return lock;
        }
    }
    

    一般来说,它是毫无问题的。

    现在,我需要在域元数据上映射此实用程序(解决方案可以使用 Map<String, Map<Object, Lock>> 或者高速缓存注入,没有无法解决的问题……

    我更喜欢将JDK UTIL或开源UTIL与类似的解决方案结合使用,因为它们已经提供了处理这种情况的功能…我相信许多面临类似问题和解决方案的开发人员应该出现在开放源码库中。我已经研究过了 spring 公用设施, apache 公用事业部分 google 但我没有找到令人满意的结果。

    建议我考虑使用合适的图书馆。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Kayaman    6 年前

    番石榴 Striped lock 实现可以做您正在做的事情,但是可以做得很好(并且有更多关于弱锁、懒惰、信号量而不是锁等的选项)。

    这和你所做的没什么不同,但你结合了 synchronized 带锁,而 ConcurrentHashMap 可以摆脱显式同步(并通过每次访问整个映射时不锁定它来提供一些性能优势)。