0 امتیاز
قبل در برنامه نویسی توسط (7.2هزار امتیاز)
برچسب گذاری دوباره قبل توسط

در یک قطعه کد جاوا یک ArrayList را داخل حلقه for each مورد دسترسی قرار می دهم. این آرایه که static است از طریق یک متد در کلاس دیگر مقدار دهی می شود. هنگام کار مقدار دهی همزمان خطای زیر را دریافت می کنم.

برای جلوگیری از این خطا چه کار می توانم بکنم؟

        for (CometEvent event : sessionEvents) {
            if (event.getEventType() != CometEvent.EventType.BEGIN)
                continue;
            HttpServletResponse response = event.getHttpServletResponse();
            response.setContentType("application/json");
            response.setCharacterEncoding("UTF-8");

            PrintWriter printwriter = null;
            try {
                printwriter = response.getWriter();

                printwriter.println(messageJson);
                printwriter.flush();
                //        message will be send with closing the connection
                printwriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                sessionEvents.remove(event);
            }
        }

 

و این هم پیغام خطا:

java.util.ConcurrentModificationException
	at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
	at java.util.AbstractList$Itr.next(AbstractList.java:343)
	at org.broker.comet.CometUtils.sendMessagesAsJson(CometUtils.java:84)
	at org.broker.comet.CometUtils.checkAndSendMessagesAsJson(CometUtils.java:116)
	at org.broker.comet.CometServlet.event(CometServlet.java:48)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilterEvent(ApplicationFilterChain.java:482)
	at org.apache.catalina.core.ApplicationFilterChain.doFilterEvent(ApplicationFilterChain.java:376)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:238)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394)
	at org.apache.coyote.http11.Http11NioProcessor.process(Http11NioProcessor.java:391)
	at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:357)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1531)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
	at java.lang.Thread.run(Thread.java:662)

 

قبل توسط (7.2هزار امتیاز)
خط اول قطعه کدی که گذاشته ام
قبل توسط (1.1هزار امتیاز)
جواب ویرایش شد.

1 پاسخ

+1 امتیاز
قبل توسط (1.1هزار امتیاز)
انتخاب شده قبل توسط
 
بهترین پاسخ

Collection ها در جاوا قابلیتی دارند با نام fail-fast که زمانی که یک thread در حال traverse کردن یک collection است اگر محتویات آن collection تغییر کند ConcurrentModificationException پرتاب می شود.

در مورد کد شما در زمان traverse لیست sessionEvents، این لیست تغییر می کند و منجر به پرتاب این exception می شود.

سوالات مشابه

+1 امتیاز
1 پاسخ 461 بازدید
+1 امتیاز
1 پاسخ 723 بازدید
+1 امتیاز
1 پاسخ 749 بازدید
0 امتیاز
1 پاسخ 684 بازدید
0 امتیاز
0 پاسخ 295 بازدید
0 امتیاز
1 پاسخ 524 بازدید
+1 امتیاز
1 پاسخ 1.3هزار بازدید
+1 امتیاز
1 پاسخ 629 بازدید
...