我需要解决具有不同内存位置的相等对象的情况(由于多线程,它会发生在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
库,但我没有找到满意的结果。
建议我考虑使用正确的图书馆。
答案 0 :(得分:1)
Guava的Striped lock实现会做你正在做的事情,但是做得恰到好处(并且有更多关于弱锁,懒惰,信号量而不是锁等的选项)。
它与您所做的并没有什么不同,但是您将synchronized
与锁定相结合,而ConcurrentHashMap
可以摆脱显式同步(并且每次访问时都不锁定整个地图,从而提供一些性能优势。