灵活的锁定方式(选择性锁定)
我需要解决具有不同内存位置的相等对象的情况(由于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
可以摆脱显式同步(并且通过在每次访问时都不锁定整个映射来提供一些性能优势)。