2013-11-22 4 views
0

Я использую ehcache для кэширования java pojo, который имеет простой jash hashmap как свойство.Cache.get() возвращает глубокую копию элемента?

Нужно ли беспокоиться об исключениях модификации параллелизма в следующем случае?

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() дает мне «глубокую копию» элемента в кеше и могу ли я просто что-либо сделать с ключом элемента и значением, не беспокоясь о параллелизме?

ответ

0

Найденный! Я анализировал объекты в кеше с помощью System.identityHashCode(), похоже, что это зависит от ситуации.

Также интересно: Copying cached Map<String , List> object into temporary Map<String , List> object

+0

вы можете уточнить это, как это зависит от ситуации? Я думаю, что он вернет тот же объект, а не копию ... – eis

+0

Это зависит, если объект был сериализован на дисковый магазин и удален из запоминающего устройства, то это не будет тот же экземпляр объекта. Вот почему я сказал: «Это зависит». – TinusSky

+0

Да, в случае дискового магазина. Однако, я думаю, если он находится в хранилище памяти, это будет тот же объект, или? – eis

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. 
Смежные вопросы