Cache.get()返回元素的深层副本?

时间:2013-11-22 18:36:30

标签: java caching ehcache

我正在使用ehcache来缓存一个java pojo,它有一个普通的java hashmap作为属性。

在下列情况下,我是否需要担心并发修改异常?

thread 1:
- obj1 = cache.get(keyx)
- obj1.hashmap.put(x, y)
- cache.put(keyx, obj1)

thread 2:
- obj1 =cache.get(keyx)
- for(akey: obj1.hashmap.keys){}

我怀疑我确实需要为hashmap使用线程安全实现,另外使我的pojo的线程安全吗?

或者cache.get()给我一个缓存中元素的“深层复制”,我可以用元素键和值做任何事情而不用担心并发吗?

2 个答案:

答案 0 :(得分:0)

发现它!我在System.identityHashCode()的帮助下分析了缓存中的对象,看来这取决于具体情况。

同样有趣: Copying cached Map<String , List> object into temporary Map<String , List> object

答案 1 :(得分:0)

ehcache has the properties :copyOnWrite and copyOnRead.
for example:

<cache name="properties"
       maxBytesLocalHeap="100M"  
        eternal="false"   
        overflowToDisk="false"
        timeToLiveSeconds="600"
        copyOnRead="true"
        copyOnWrite="true">
</cache>

in the ehcache.xml or look at net.sf.ehcache.config.CacheConfiguration#copyOnRead.