日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java.util.ConcurrentModificationException异常分析

發(fā)布時(shí)間:2024/2/28 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java.util.ConcurrentModificationException异常分析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

異常日志

2016-07-20 15:02:41,278 (New I/O worker #197) [ERROR - org.apache.flume.source.AvroSource.appendBatch(AvroSource.java:388)] Avro source r1: Unable to process event batch. Exception follows. java.util.ConcurrentModificationExceptionat java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)at java.util.ArrayList$Itr.next(ArrayList.java:851)at org.apache.flume.channel.ChannelProcessor.processEventBatch(ChannelProcessor.java:157)at org.apache.flume.source.AvroSource.appendBatch(AvroSource.java:386)at sun.reflect.GeneratedMethodAccessor7.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:497)at org.apache.avro.ipc.specific.SpecificResponder.respond(SpecificResponder.java:91)at org.apache.avro.ipc.Responder.respond(Responder.java:151)at org.apache.avro.ipc.NettyServer$NettyServerAvroHandler.messageReceived(NettyServer.java:188)at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)at org.apache.avro.ipc.NettyServer$NettyServerAvroHandler.handleUpstream(NettyServer.java:173)at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:558)at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:786)at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296)at org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:458)at org.jboss.netty.handler.codec.frame.FrameDecoder.callDecode(FrameDecoder.java:439)at org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived(FrameDecoder.java:311)at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:558)at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:553)at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268)at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255)at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:84)at org.jboss.netty.channel.socket.nio.AbstractNioWorker.processSelectedKeys(AbstractNioWorker.java:471)at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:332)at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:35)at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:102)at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)at java.lang.Thread.run(Thread.java:745)

異常原因

首先我們可以看到異常是由ArrayList的checkForComodification拋出的。這個(gè)方法在遍歷List調(diào)用next()方法的時(shí)候會(huì)被調(diào)用,用于檢查List是否已經(jīng)被修改了。
也就是說問題出在遍歷的時(shí)候,List被修改了。
進(jìn)一步檢查代碼,發(fā)現(xiàn)List<Channel> requiredChannels = new ArrayList<Channel>();作為成員變量被定義,而在運(yùn)行的過程中,這個(gè)變量會(huì)被修改。

解決辦法

  • 將共享變量改為線程私有變量。這次遇到的情況,剛好是不需要定義為成員變量的情況,所以直接將成員變量改為方法局部變量,問題解決。根據(jù)實(shí)際情況來定,如果能用這種方案,當(dāng)然是優(yōu)先選擇這種方案。
  • 使用線程安全的類替換。由于ArrayList是一個(gè)非線程安全的類,可以采用線程安全的類進(jìn)行替換,如CopyOnWriteArrayList。不能使用Vector,Vector在遍歷的時(shí)候不是線程安全的。
  • 使用加鎖等同步方案。

總結(jié)

以上是生活随笔為你收集整理的java.util.ConcurrentModificationException异常分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。