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

时间:2018-05-29 15:21:48

标签: java multithreading concurrency locking

我需要解决具有不同内存位置的相等对象的情况(由于多线程,它会发生在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;
    }
}

一般来说它没有问题。

现在我需要在域元数据上映射这个util(解决方案可以使用Map<String, Map<Object, Lock>>或缓存注入,没有任何不可解析的内容)......

我更喜欢使用JDK util或open source util和类似的解决方案,因为他们已经提供了处理这种情况......我相信很多开发人员都面临类似的问题,解决方案应该存在于开源库中。我研究了spring实用程序,apache实用了一些google库,但我没有找到满意的结果。

建议我考虑使用正确的图书馆。

1 个答案:

答案 0 :(得分:1)

Guava的Striped lock实现会做你正在做的事情,但是做得恰到好处(并且有更多关于弱锁,懒惰,信号量而不是锁等的选项)。

它与您所做的并没有什么不同,但是您将synchronized与锁定相结合,而ConcurrentHashMap可以摆脱显式同步(并且每次访问时都不锁定整个地图,从而提供一些性能优势。