Hi,

I don't know JCS at all, but the exception you get is the result of one thread updating a collection (in your case a HashMap) whilst another thread is iterating it. This would happen even if the Map was decorated using the Collections.synchronizedMap( myMap ) facility. To allow /true/ concurrent access/updates to a Map, the java.util.concurrent.ConcurrentHashMap (or another class implementing the ConcurrentMap) must be deployed.

If you use a synchronized Map as underlying structure for something, then you have to protect an iteration using the map itself as a synchronization token.

public class Users {

private final Map< String, User > users = Collections.synchronizedMap( new HashMap< String, User >() );

   public void insertUser( User u ) {
      Require.notNull( u );
      users.put( u.getName(), u);
   }

   public Collection< User > findUsersBornBefore( Date date ) {
       List< User > result = new ArrayList< User >();
synchronized( users ) { // if not synchronized, the users structure may be concurrently modified
           for( User user : users.values() ) {
               if( user.getBirthdate().before( date ) ) {
                    result.add( user );
                }
           }
       }
       return result;
   }

}

May there is a way you can force JCS to use another Map implementation than HashMap? Some factory method somewhere?

--

Thomas

On 25/01/2012 12:03, NM, Vijayakumar wrote:
Hi All,

We have an application which uses JCS cache to write data into 
IndexedDiskCache, sometime are getting ConcurrentModificationException when 
application tries to update the cache object frequently, please let me know 
what could be the reason and is there any workarounds to solve the issue. We 
are using JCS 1.3

2012-01-25 10:38:44,088 ERROR [RemoteCache] -<Disabling remote cache due to error: 
Failed to put [TEMP1] to tempRegion>
java.util.ConcurrentModificationException
                 at java.util.HashMap$HashIterator.nextEntry(HashMap.java:841)
                 at java.util.HashMap$EntryIterator.next(HashMap.java:883)
                 at java.util.HashMap$EntryIterator.next(HashMap.java:881)
                 at java.util.HashMap.writeObject(HashMap.java:1037)
                 at sun.reflect.GeneratedMethodAccessor15.invoke(Unknown Source)
                 at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
                 at java.lang.reflect.Method.invoke(Method.java:592)
                 at 
java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:917)
                 at 
java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1339)
                 at 
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1290)
                 at 
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1079)
                 at 
java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1375)
                 at 
java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1347)
                 at 
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1290)
                 at 
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1079)
                 at 
java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:302)
                 at 
org.apache.jcs.utils.serialization.StandardSerializer.serialize(StandardSerializer.java:50)
                 at 
org.apache.jcs.utils.serialization.SerializationConversionUtil.getSerializedCacheElement(SerializationConversionUtil.java:73)
                 at 
org.apache.jcs.auxiliary.remote.RemoteCache.update(RemoteCache.java:207)
                 at 
org.apache.jcs.engine.CacheAdaptor.handlePut(CacheAdaptor.java:91)
                 at 
org.apache.jcs.engine.PooledCacheEventQueue$PutEvent.doRun(PooledCacheEventQueue.java:474)
                 at 
org.apache.jcs.engine.PooledCacheEventQueue$AbstractCacheEvent.run(PooledCacheEventQueue.java:397)
                 at 
EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:748)
                 at java.lang.Thread.run(Thread.java:595)

Regards,
Vijay







This message contains information that may be privileged or confidential and is 
the property of the Capgemini Group. It is
intended only for the person to whom it is addressed. If you are not the 
intended recipient, you are not authorized to
read, print, retain, copy, disseminate, distribute, or use this message or any 
part thereof. If you receive this message
in error, please notify the sender immediately and delete all copies of this 
message.


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to