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 پاسخ 456 بازدید
+1 امتیاز
1 پاسخ 712 بازدید
+1 امتیاز
1 پاسخ 740 بازدید
0 امتیاز
1 پاسخ 665 بازدید
0 امتیاز
0 پاسخ 292 بازدید
0 امتیاز
1 پاسخ 508 بازدید
+1 امتیاز
1 پاسخ 1.3هزار بازدید
+1 امتیاز
1 پاسخ 624 بازدید
...