On one page I use a persistent Hashmap. The page contains an actionLink with a click event handler. The onclick event is activated with a delay using setTimeout. When the event is fired another actionLink is activated. Now what happens is that during the handling of the first actionLink the second actionLink is activated and this results in a ConcurrentModificationException on the Hashmap. I can solve it by using a multithread safe Hashmap but I want to understand under what circumstances you need to be carefull for multi threaded activation (with Tapestry 5 that is). Should a Persisted variable always be multithread safe? I think so but what other Tapestry related items should be multithread safe as well?
Martijn Stack trace: java.util.ConcurrentModificationException Stack trace * java.util.HashMap $HashIterator.nextEntry(HashMap.java:793) * java.util.HashMap$KeyIterator.next(HashMap.java:828) * mitm.mimesecure.web.components.CertificateStoreGrid.downloadSelected(CertificateStoreGrid.java:76) * mitm.mimesecure.web.components.CertificateStoreGrid.dispatchComponentEvent(CertificateStoreGrid.java) * org.apache.tapestry5.internal.structure.ComponentPageElementImpl.dispatchEvent(ComponentPageElementImpl.java:864) * org.apache.tapestry5.internal.structure.ComponentPageElementImpl.triggerContextEvent(ComponentPageElementImpl.java:1025) * org.apache.tapestry5.internal.services.ComponentEventRequestHandlerImpl.handle(ComponentEventRequestHandlerImpl.java:67) * org.apache.tapestry5.internal.services.ImmediateActionRenderResponseFilter.handle(ImmediateActionRenderResponseFilter.java:42) * org.apache.tapestry5.internal.services.AjaxFilter.handle(AjaxFilter.java:42) * org.apache.tapestry5.services.TapestryModule $37.handle(TapestryModule.java:1987) * org.apache.tapestry5.internal.services.ComponentEventDispatcher.dispatch(ComponentEventDispatcher.java:135) * org.apache.tapestry5.services.TapestryModule $12.service(TapestryModule.java:938) * org.apache.tapestry5.internal.services.LocalizationFilter.service(LocalizationFilter.java:42) * org.apache.tapestry5.services.TapestryModule $2.service(TapestryModule.java:586) * org.apache.tapestry5.internal.services.RequestErrorFilter.service(RequestErrorFilter.java:26) * org.apache.tapestry5.internal.services.StaticFilesFilter.service(StaticFilesFilter.java:79) * org.apache.tapestry5.internal.services.CheckForUpdatesFilter$2.invoke(CheckForUpdatesFilter.java:93) * org.apache.tapestry5.internal.services.CheckForUpdatesFilter$2.invoke(CheckForUpdatesFilter.java:84) * org.apache.tapestry5.ioc.internal.util.ConcurrentBarrier.withRead(ConcurrentBarrier.java:75) * org.apache.tapestry5.internal.services.CheckForUpdatesFilter.service(CheckForUpdatesFilter.java:106) * org.apache.tapestry5.services.TapestryModule $11.service(TapestryModule.java:918) * org.apache.tapestry5.upload.internal.services.MultipartServletRequestFilter.service(MultipartServletRequestFilter.java:44) * org.apache.tapestry5.internal.services.IgnoredPathsFilter.service(IgnoredPathsFilter.java:62) * org.apache.tapestry5.TapestryFilter.doFilter(TapestryFilter.java:168) * org.mortbay.jetty.servlet.ServletHandler $CachedChain.doFilter(ServletHandler.java:1084) * org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360) * org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) * org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) * org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:726) * org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) * org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) * org.mortbay.jetty.Server.handle(Server.java:324) * org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505) * org.mortbay.jetty.HttpConnection $RequestHandler.headerComplete(HttpConnection.java:828) * org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:514) * org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211) * org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380) * org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395) * org.mortbay.thread.BoundedThreadPool $PoolThread.run(BoundedThreadPool.java:450) --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]