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 پاسخ 298 بازدید
+1 امتیاز
1 پاسخ 535 بازدید
+1 امتیاز
1 پاسخ 609 بازدید
0 امتیاز
1 پاسخ 473 بازدید
0 امتیاز
0 پاسخ 251 بازدید
0 امتیاز
1 پاسخ 292 بازدید
+1 امتیاز
1 پاسخ 1.2هزار بازدید
+1 امتیاز
1 پاسخ 473 بازدید
...