You are right, ConcurrentHashMap would prevent the
ConcurrentModificationException. Though if a session has been closed and
is removed from the map while you are iterating you could still get it
from the Iterator since ConcurrentHashMap takes a "snapshot" of the map
at the time you call .iterator(). You should deal with that in your
while-loop (e.g. check session.isClosing()) before you write to the session.

/Niklas

mat wrote:
> Thanks for your great explanation. So for performance issue, maybe we
> should
> consider to use concurrentmap in JDK1.5?
>
> 2007/4/23, Niklas Therning <[EMAIL PROTECTED]>:
>>
>> mat wrote:
>> > Hi folks,
>> >
>> > If the code is correct? do I need synchronized (sessions)?
>> >
>> > I have a hashtable to maintain the IoSession.
>> >
>> > public void onBroadcasting(MyMessage message)
>> > {
>> >  Enumeration e = sessions.elements();
>> >
>> >  while(e.hasMoreElements())
>> >  {
>> >   IoSession session = (IoSession)e.nextElement();
>> >      session.write(message);
>> >  }
>> > }
>> >
>> >
>> > However, in mina chat example. Is it neccessary to synchronized(
>> > sessions )?
>> >
>> >
>> >    public void broadcast( String message )
>> >    {
>> >        synchronized( sessions )
>> >        {
>> >            Iterator iter = sessions.iterator();
>> >            while( iter.hasNext() )
>> >            {
>> >                IoSession s = ( IoSession ) iter.next();
>> >                if( s.isConnected() )
>> >                {
>> >                    s.write( "BROADCAST OK " + message );
>> >                }
>> >            }
>> >        }
>> >    }
>> >
>>
>> Depends on what Collection you are using to store the sessions. In the
>> chat example we need to synchronize because if a new client connects
>> while we are iterating over the elements we would get a
>> ConcurrentModificationException without the synchronization.
>>
>> Hashtable.iterator() and listIterator() are fail-fast which means that
>> they throw ConcurrentModificationException if the Hashtable is changed
>> while iterating (not changed using the Iterator's methods). The
>> Enumeration returned by Hashtable.elements() is not fail-fast. I think
>> that means that things can go horribly wrong at any time (fast or slow)
>> if the Hashtable is modified. :-)
>>
>> -- 
>> Niklas Therning
>> www.spamdrain.net
>>
>>
>


-- 
Niklas Therning
www.spamdrain.net

Reply via email to