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 پاسخ 465 بازدید
+1 امتیاز
1 پاسخ 732 بازدید
+1 امتیاز
1 پاسخ 756 بازدید
0 امتیاز
1 پاسخ 697 بازدید
0 امتیاز
0 پاسخ 299 بازدید
0 امتیاز
1 پاسخ 539 بازدید
+1 امتیاز
1 پاسخ 1.4هزار بازدید
+1 امتیاز
1 پاسخ 640 بازدید
...