在整数值上同步
可能的重复:
在java中增加锁数量的最佳方法是什么
假设我想根据整数id值进行锁定。在本例中,有一个函数从缓存中提取值,如果值不存在,则执行相当昂贵的检索/存储到缓存中。
现有代码未同步,可能会触发多个检索/存储操作:
//psuedocode
public Page getPage (Integer id){
Page p = cache.get(id);
if (p==null)
{
p=getFromDataBase(id);
cache.store(p);
}
}
我想做的是同步id上的检索,例如
if (p==null)
{
synchronized (id)
{
..retrieve, store
}
}
不幸的是,这不起作用,因为 2 个单独的调用可以具有相同的 Integer id 值,但具有不同的 Integer 对象,因此它们不会共享锁,也不会发生同步。
有没有一种简单的方法来确保您具有相同的整数实例?例如,这是否有效:
syncrhonized (Integer.valueOf(id.intValue())){
Integer.valueOf() 的 javadoc 似乎暗示你可能会得到相同的实例,但这看起来并不像是一个保证:
返回一个 Integer 实例,该实例表示指定的 int 值。如果不需要新的 Integer 实例,则通常应优先使用此方法而不是构造函数 Integer(int),因为此方法可能会通过缓存频繁请求的值来显著提高空间和时间性能。
那么,关于如何获得一个保证相同的整数实例的任何建议,除了更复杂的解决方案,如保持锁对象的WeakHashMap键控到int?(这没什么错,似乎一定有一个明显的单行线,而不是我错过的)。