现有的代码没有同步,可能会触发多个检索/存储操作。
//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
}
}
很遗憾,这不会起作用,因为两个独立的调用可以具有相同的整数id值,但是不同的整数对象,所以它们不会共享锁,并且不会发生同步。
有没有一种简单的方法来确保您拥有相同的整数实例?例如,这样会起作用吗?
syncrhonized (Integer.valueOf(id.intValue())){
Integer.valueOf()的javadoc似乎暗示你可能会得到相同的实例,但这并不是一个保证:
返回一个表示指定int值的Integer实例。如果不需要新的Integer实例,通常应该优先使用这个方法而不是构造函数Integer(int),因为这个方法通过缓存经常请求的值,很可能在空间和时间性能上得到显著的改善。
所以,除了像保持一个以int为键的WeakHashMap的Lock对象的更复杂的解决方案之外,你有没有关于如何获得一个保证相同的Integer实例的建议?(这种解决方案没有问题,只是似乎有一个明显的一行代码的解决方案我没有注意到)。
Integer
,具体时间为54:49。 - Basil Bourque