我有番石榴缓存存储userId互斥缓存。番石榴缓存asMap方法
Cache<Long, Object> byUserIdMutex = CacheBuilder.newBuilder()
.concurrencyLevel(4)
.weakKeys()
.maximumSize(10000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build();
private Object getMutex(long userId) {
Object newLock = new Object();
Object old = byUserIdMutex.asMap().putIfAbsent(userId, newLock);
if (old != null) {
return old;
}
return newLock;
}
然后我使用带有互斥对象的synchronized节。我期望来自不同线程的相同用户将通过同一个密钥等待另一个任务完成。
比方说,如果我有线程1
synchronized (getMutex(1)) {
}
那么线程2等待线程1离开同步之前执行完毕,但事实证明,这不会发生,线程不等待对方。
也许我有一个比赛时使用asMap()方法转换番石榴缓存地图?
请考虑使用Guava的“Striped”进行锁定,而不是缓存。 –
@BenManes不适合我。即使我在里面创建了带有足够条纹(锁)的Striped,当不同的用户互相等待时,我可能会发生碰撞。 – user12384512
大型懒惰弱条纹是一个弱值地图。所以,或者直接做同样的事情,将会是一个更安全的驱逐政策。 –