On 5/10/05, Leszek Gawron <[EMAIL PROTECTED]> wrote: > Vadim Gritsenko wrote: > > Leszek Gawron wrote: > > > >> Vadim Gritsenko wrote: > >> > >>> If you want to tinker with ContinuationsManagerImpl, take a look at: > >>> http://marc.theaimsgroup.com/?l=xml-cocoon-dev&m=111323704203839 > >> > >> > >> Strange I missed that post .. > >> > >> > >>> Unsynchronized access to WebContinuationsHolder from > >>> invalidateContinuations() simultaneously with write access in > >>> generateContinuation() should reliably cause > >>> ConcurrentModificationException. > >> > >> > >> I do not quite get the problem. Doesn't it cause > >> ConcurrentModificationException now? > > > > > > It should - I've not seen it though. > > > > > >> Other thing is how can invalidateContinuations and > >> generateContinuation be run concurrently. invalidateContinuations is > >> invoked only for expired sessions - how can new continuation be > >> generated for that session? > > > > > > Bad example then. Here is better one: > > > > invalidateContinuations() gets Iterator on continuationsHolder.holder > > map. > > invalidateContinuations() calls _invalidate() > > _invalidate() calls disposeContinuation() > > disposeContinuation() modifies continuationsHolder.holder map. > > > > After that, > > > > invalidateContinuations() calls next() and causes > > ConcurrentModificationException. > > > > Seems to me invalidateContinuations() should have while(!empty) loop > > instead of iterator. > Still HashMap has no interface other than iterator to get it's contents. > you can either iterate through hashMap.iterator() or > hashMap().keySet().iterator() - no difference, both are synced. > > any ideas?
I've seen this problem with the 1.4.2_02 JDK, don't know if it exists elsewhere. The Sun docs claim syncrhonizing on the hashMap should solve the problem but it doesn't. The solution I came up with was to build an array instead of using an iterator, eg: Object[] list = targetObjects.keySet().toArray(); Peter Hunsberger