这是我在进行多线程阅读和写作时使用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。
一开始阅读和写作还不错,但几个小时后,我的阅读和写作都不一致......
有人可以帮我解决这个问题吗?非常感谢
答案 0 :(得分:0)
缓存已经是一个线程安全的数据结构,所以你不需要像你一样使用显式锁定。
此外,方法Cache.putIfAbsent
已经是一个原子操作,可以保证只有一个线程可以成功使用put。
请注意,驱逐和到期是两回事。使用您的配置,当缓存大小超过128MB并且到期确实在60秒后发生时,就会发生驱逐。但是,Ehcache会在线到期,因此在您读取或写入映射时会触发它。
至于你对不一致的评论,你需要更详细地描述你的意思。