我可以在ehcache上使用isKeyInCache并将方法替换为putIfAbsent吗?

时间:2013-07-17 04:24:28

标签: java ehcache

我可以在ehcache上使用isKeyInCache并将方法替换为putIfAbsent吗?

这是我的测试代码,性能差异很大

// putIfAbsent 
time = System.nanoTime();
ehcache.putIfAbsent(new Element(assetUid, asset));
estimated = System.nanoTime();
System.out.println(estimated - time);

// isKeyInCache and put
time = System.nanoTime();
if (!ehcache.isKeyInCache(assetUid)) {
    ehcache.put(new Element(assetUid, asset));
}
estimated = System.nanoTime();
System.out.println(estimated - time);

和控制台输出

1693409
18235

或者您有其他建议吗?谢谢

1 个答案:

答案 0 :(得分:2)

简短的回答是putIfAbsent()将尊重锁定和竞争条件(换句话说,在某处同步)以确保条目确实只在没有任何内容的情况下放置...或者当前正由另一个线程等编写。

调用isKeyInCache不会。 来自http://ehcache.org/apidocs/net/sf/ehcache/Ehcache.html#isKeyInCache(java.lang.Object): “检查密钥是否存在于缓存中是一种便宜的检查。 此方法不同步。元素可能存在于缓存中并在检查到达之前被删除,反之亦然。由于没有对Element的状态进行断言,因此Element可能已过期,但此方法仍然返回true。“

这解释了时间差异......

从上面来看,它实际上取决于你的用例...你能否接受这样的陈述:“有可能一个元素可能存在于缓存中并在检查到达之前被删除,反之亦然” ?如果是,请使用isKeyInCache()检查... 如果你想在检查期间确定,请坚持使用putIfAbsent()......