如何在ehcache中进行多线程编写?

时间:2015-12-10 04:02:45

标签: ehcache

这是我在进行多线程阅读和写作时使用ehcache的代码:

编写代码:

try {
    targetCache.acquireWriteLockOnKey(key);
    targetCache.putIfAbsent(new Element(key, value));
}
finally {
    targetCache.releaseWriteLockOnKey(key);
}

阅读代码:

try{
    cache.acquireReadLockOnKey(key);
    cacheCarId = (String)ele.getObjectValue();
}
finally {
    cache.releaseReadLockOnKey(key);
}

键和值都是String。

我的配置如下:

CacheConfiguration config = new CacheConfiguration();
config.name("carCache");
config.maxBytesLocalHeap(128, MemoryUnit.parseUnit("M"));
config.eternal(false);
config.timeToLiveSeconds(60);
config.setTimeToIdleSeconds(60);
SizeOfPolicyConfiguration sizeOfPolicyConfiguration = new SizeOfPolicyConfiguration();
sizeOfPolicyConfiguration.maxDepth(10000);
sizeOfPolicyConfiguration.maxDepthExceededBehavior("abort");
config.addSizeOfPolicy(sizeOfPolicyConfiguration);
Cache memoryOnlyCache = new Cache(config);
CacheManager.getInstance().addCache(memoryOnlyCache);

值在60秒内逐出,将由多线程编写。密钥总数少于25,000。

一开始阅读和写作还不错,但几个小时后,我的阅读和写作都不一致......

有人可以帮我解决这个问题吗?非常感谢

1 个答案:

答案 0 :(得分:0)

缓存已经是一个线程安全的数据结构,所以你不需要像你一样使用显式锁定。

此外,方法Cache.putIfAbsent已经是一个原子操作,可以保证只有一个线程可以成功使用put。

请注意,驱逐和到期是两回事。使用您的配置,当缓存大小超过128MB并且到期确实在60秒后发生时,就会发生驱逐。但是,Ehcache会在线到期,因此在您读取或写入映射时会触发它。

至于你对不一致的评论,你需要更详细地描述你的意思。