【发布时间】:2009-03-18 20:15:47
【问题描述】:
可能重复:
What is the best way to increase number of locks in 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 对象,因此它们不会共享锁,并且不会发生同步。
是否有一种简单的方法可以确保您拥有相同的 Integer 实例?例如,这是否可行:
syncrhonized (Integer.valueOf(id.intValue())){
Integer.valueOf() 的 javadoc 似乎暗示您可能会得到相同的实例,但这看起来不像是保证:
返回一个整数实例 表示指定的 int 值。 如果一个新的 Integer 实例不是 需要,这种方法一般应该 优先使用 构造函数 Integer(int),如 this 方法可能会产生 明显更好的空间和时间 通过频繁缓存来提高性能 请求的值。
那么,除了更复杂的解决方案(例如保持锁定对象的 WeakHashMap 与 int 键控)之外,关于如何获得保证相同的 Integer 实例的任何建议? (这并没有错,似乎肯定有一个明显的单行比我错过了)。
【问题讨论】:
-
这个“重复”问题和下面 Eddie 的回答比“原始”问题要好!
-
用AtomicInteger怎么样?
-
仅供参考,Brian Goetz 在他的 Devoxx 2018 演讲 at 54:49 中提到,永远不要锁定
Integer。
标签: java synchronization