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

我需要解决具有不同内存位置的相等对象的情况(由于multithreading,它发生在REST请求中)。

因此作为部分解决方案,我实施了服务。 我在这里分享最重要的部分:

private Map 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>或缓存注入,没有什么不可解析的)…

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

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

Guava的Striped锁实现可以做你正在做的事情,但是正确(并且有很多关于弱锁,懒惰,信号量而不是锁等的选项)。

它与您所做的并没有什么不同,但是您已经将锁定synchronized ,而ConcurrentHashMap可以摆脱显式同步(并且通过在每次访问时都不锁定整个映射来提供一些性能优势)。