gpt4 book ai didi

java - 灵活的锁定替代方案(选择性锁定)

转载 作者:行者123 更新时间:2023-11-30 06:09:28 27 4
gpt4 key购买 nike

我需要解决具有不同内存位置的相同对象的情况(由于多线程,这种情况发生在 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>> 或缓存注入(inject),没有什么无法解决的)...

我更喜欢使用 JDK util 或具有类似解决方案的开源 util,因为它们已经提供了处理这种情况的功能...我相信许多开发人员面临类似的问题,并且解决方案应该存在于开源库中。我研究过spring公用事业,apache公用事业一些google图书馆,但我还没有找到满意的结果。

建议我考虑使用正确的库。

最佳答案

Guava 的Striped lock实现做了你正在做的事情,但是正确(并且有更多关于弱锁、惰性、信号量而不是锁等的选项)。

这与您所做的没有什么不同,但是您将 synchronized 与锁结合在一起,而 ConcurrentHashMap 可以摆脱显式同步(并提供通过在每次访问时不锁定整个 map 来获得一些性能优势)。

关于java - 灵活的锁定替代方案(选择性锁定),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50587897/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com