﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-linda工作笔记</title><link>http://www.blogjava.net/houlinyan/</link><description>linda工作笔记子标题</description><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 01:19:37 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 01:19:37 GMT</pubDate><ttl>60</ttl><item><title>urls</title><link>http://www.blogjava.net/houlinyan/archive/2009/08/24/292445.html</link><dc:creator>linda</dc:creator><author>linda</author><pubDate>Mon, 24 Aug 2009 13:05:00 GMT</pubDate><guid>http://www.blogjava.net/houlinyan/archive/2009/08/24/292445.html</guid><wfw:comment>http://www.blogjava.net/houlinyan/comments/292445.html</wfw:comment><comments>http://www.blogjava.net/houlinyan/archive/2009/08/24/292445.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/houlinyan/comments/commentRss/292445.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/houlinyan/services/trackbacks/292445.html</trackback:ping><description><![CDATA[&nbsp;http://search.live.com/results.aspx?q=openproxy.huawei.com&amp;src=IE-Address
<img src ="http://www.blogjava.net/houlinyan/aggbug/292445.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/houlinyan/" target="_blank">linda</a> 2009-08-24 21:05 <a href="http://www.blogjava.net/houlinyan/archive/2009/08/24/292445.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java调用其他程序的问题</title><link>http://www.blogjava.net/houlinyan/archive/2008/10/09/233335.html</link><dc:creator>linda</dc:creator><author>linda</author><pubDate>Thu, 09 Oct 2008 05:32:00 GMT</pubDate><guid>http://www.blogjava.net/houlinyan/archive/2008/10/09/233335.html</guid><wfw:comment>http://www.blogjava.net/houlinyan/comments/233335.html</wfw:comment><comments>http://www.blogjava.net/houlinyan/archive/2008/10/09/233335.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/houlinyan/comments/commentRss/233335.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/houlinyan/services/trackbacks/233335.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 大家都知道java调用cmd 用的是Runtime的exec()方法。该方法最终重启一个进程去执行命令，因为该方法最终调用了ProcessBuilder：1 public Process exec(String[] strings, String[] strings_2_, File file)2    throws IOException {3    return new ProcessBuil...&nbsp;&nbsp;<a href='http://www.blogjava.net/houlinyan/archive/2008/10/09/233335.html'>阅读全文</a><img src ="http://www.blogjava.net/houlinyan/aggbug/233335.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/houlinyan/" target="_blank">linda</a> 2008-10-09 13:32 <a href="http://www.blogjava.net/houlinyan/archive/2008/10/09/233335.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在多线程的情况下是由Iterator遍历修改集合对象，报ConcurrentModificationException()异常的根因分析。</title><link>http://www.blogjava.net/houlinyan/archive/2008/04/01/189924.html</link><dc:creator>linda</dc:creator><author>linda</author><pubDate>Tue, 01 Apr 2008 01:56:00 GMT</pubDate><guid>http://www.blogjava.net/houlinyan/archive/2008/04/01/189924.html</guid><wfw:comment>http://www.blogjava.net/houlinyan/comments/189924.html</wfw:comment><comments>http://www.blogjava.net/houlinyan/archive/2008/04/01/189924.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/houlinyan/comments/commentRss/189924.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/houlinyan/services/trackbacks/189924.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在多线程下使用Iterator来迭代对象时，总会包ConcurrentModificationException();异常，经过我对list和Iterator相关源码的分析，终于搞明白了这个问题：&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面结合源代码来讨论这个问题：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、当我们调用一个List的iterator时，其实返回的并不是Itr对象（Iterator是一个接口），请看代码：<br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; margin-left: 10px; border-left: #cccccc 1px solid; width: 83.82%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; height: 64px; background-color: #eeeeee" align="left"><span style="font-size: 10pt"><span style="color: #008080">1</span><img id="Codehighlighter1_32_55_Open_Image" onclick="this.style.display='none'; Codehighlighter1_32_55_Open_Text.style.display='none'; Codehighlighter1_32_55_Closed_Image.style.display='inline'; Codehighlighter1_32_55_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_32_55_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_32_55_Closed_Text.style.display='none'; Codehighlighter1_32_55_Open_Image.style.display='inline'; Codehighlighter1_32_55_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Iterator</span><span style="color: #000000">&lt;</span><span style="color: #000000">E</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;iterator()&nbsp;</span><span id="Codehighlighter1_32_55_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span></span><span id="Codehighlighter1_32_55_Open_Text"><span style="font-size: 10pt"><span style="color: #000000">{<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span></span><span style="font-size: 10pt"><span style="color: #000000">&nbsp;Itr();<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;}</span></span></span></div>
<span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、在Itr类中有这么一句话&nbsp;&nbsp;int expectedModCount = modCount;首先讲一下这两个变量的含义：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; expectedModCount ：创建当前的Itr对象时集合对象被修改的次数。他是Itr的变量。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; modCount：记录集合对象从创建到当前时间被做修改的次数。（集合每进行一次增删改查都会使modCount），他是Itr的外部类AbstractList<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 的变量，且该变量在&nbsp;AbstractList中被如此修饰protected transient int modCount = 0;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另外，Itr自己对集合对象进行了修改后，他会维持expectedModCount&nbsp;和modCount的保持相等，请看以下代码 </span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="font-size: 10pt"><span style="color: #008080">&nbsp;1</span>&nbsp;<span style="color: #008000">//</span><span style="color: #008000">Itr的删除方法</span></span><span style="color: #008000"><br />
</span><span style="font-size: 10pt"><span style="color: #008080">&nbsp;2</span>&nbsp;<span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span></span><span style="font-size: 10pt"><span style="color: #000000">&nbsp;remove()&nbsp;{<br />
</span><span style="color: #008080">&nbsp;3</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(lastRet&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span></span><span style="font-size: 10pt"><span style="color: #000000">)<br />
</span><span style="color: #008080">&nbsp;4</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span></span><span style="font-size: 10pt"><span style="color: #000000">&nbsp;IllegalStateException();<br />
</span><span style="color: #008080">&nbsp;5</span>&nbsp;</span><span style="font-size: 10pt"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;checkForComodification();<br />
</span><span style="color: #008080">&nbsp;6</span>&nbsp;</span><span style="color: #000000"><br />
</span><span style="font-size: 10pt"><span style="color: #008080">&nbsp;7</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span></span><span style="font-size: 10pt"><span style="color: #000000">&nbsp;{<br />
</span><span style="color: #008080">&nbsp;8</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AbstractList.</span><span style="color: #0000ff">this</span></span><span style="font-size: 10pt"><span style="color: #000000">.remove(lastRet);<br />
</span><span style="color: #008080">&nbsp;9</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(lastRet&nbsp;</span><span style="color: #000000">&lt;</span></span><span style="font-size: 10pt"><span style="color: #000000">&nbsp;cursor)<br />
</span><span style="color: #008080">10</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cursor</span><span style="color: #000000">--</span></span><span style="font-size: 10pt"><span style="color: #000000">;<br />
</span><span style="color: #008080">11</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastRet&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span></span><span style="font-size: 10pt"><span style="color: #000000">;<br />
</span><span style="color: #008080">12</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expectedModCount&nbsp;</span><span style="color: #000000">=</span></span><span style="font-size: 10pt"><span style="color: #000000">&nbsp;modCount;<br />
</span><span style="color: #008080">13</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span></span><span style="font-size: 10pt"><span style="color: #000000">(IndexOutOfBoundsException&nbsp;e)&nbsp;{<br />
</span><span style="color: #008080">14</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span></span><span style="font-size: 10pt"><span style="color: #000000">&nbsp;ConcurrentModificationException();<br />
</span><span style="color: #008080">15</span>&nbsp;</span><span style="font-size: 10pt"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">16</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br />
<span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在代码的12行，Itr保证了expectedModCount&nbsp;和modCount值的相等&nbsp;，modCount的值发生了改变吗，他改变了，带代码的第8行改变的，请看此处的代码：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="font-size: 10pt"><span style="color: #008080">&nbsp;1</span><img id="Codehighlighter1_27_308_Open_Image" onclick="this.style.display='none'; Codehighlighter1_27_308_Open_Text.style.display='none'; Codehighlighter1_27_308_Closed_Image.style.display='inline'; Codehighlighter1_27_308_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_27_308_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_27_308_Closed_Text.style.display='none'; Codehighlighter1_27_308_Open_Image.style.display='inline'; Codehighlighter1_27_308_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;E&nbsp;remove(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;index)&nbsp;</span><span id="Codehighlighter1_27_308_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span></span><span id="Codehighlighter1_27_308_Open_Text"><span style="font-size: 10pt"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;2</span></span><span style="font-size: 10pt"><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;RangeCheck(index);<br />
</span><span style="color: #008080">&nbsp;3</span></span><span style="font-size: 10pt"><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;modCount</span><span style="color: #000000">++</span></span><span style="font-size: 10pt"><span style="color: #000000">;<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;E&nbsp;oldValue&nbsp;</span><span style="color: #000000">=</span></span><span style="font-size: 10pt"><span style="color: #000000">&nbsp;elementData[index];<br />
</span><span style="color: #008080">&nbsp;6</span></span><span style="font-size: 10pt"><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;numMoved&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;size&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;index&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span></span><span style="font-size: 10pt"><span style="color: #000000">;<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(numMoved&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span></span><span style="font-size: 10pt"><span style="color: #000000">)<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.arraycopy(elementData,&nbsp;index</span><span style="color: #000000">+</span><span style="color: #000000">1</span></span><span style="font-size: 10pt"><span style="color: #000000">,&nbsp;elementData,&nbsp;index,<br />
</span><span style="color: #008080">10</span></span><span style="font-size: 10pt"><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numMoved);<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;elementData[</span><span style="color: #000000">--</span><span style="color: #000000">size]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Let&nbsp;gc&nbsp;do&nbsp;its&nbsp;work</span></span><span style="color: #008000"><br />
</span><span style="font-size: 10pt"><span style="color: #008080">12</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span></span><span style="color: #000000"><br />
</span><span style="font-size: 10pt"><span style="color: #008080">13</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span></span><span style="font-size: 10pt"><span style="color: #000000">&nbsp;oldValue;<br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span></div>
<br />
<span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在代码的第四行modCount发生了改变。&nbsp;由此可以看出，在我们调用集合对象的iterator()方法的remove时总会使list的modCount的值自增1，但是Itr会自己维护该值和expectedModCount&nbsp;的一致。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、试问：如果expectedModCount&nbsp;和modCount的值如果不相等，会有什么问题呢，这就是报ConcurrentModificationException();异常的原因所在，请先看Itr的next()方法和next()调用的方法<br />
</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="font-size: 10pt"><span style="color: #008080">&nbsp;1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #008000">//</span><span style="color: #008000">Itr的next方法：</span></span><span style="color: #008000"><br />
</span><span style="font-size: 10pt"><span style="color: #008080">&nbsp;2</span><span style="color: #008000"><img id="Codehighlighter1_30_260_Open_Image" onclick="this.style.display='none'; Codehighlighter1_30_260_Open_Text.style.display='none'; Codehighlighter1_30_260_Closed_Image.style.display='inline'; Codehighlighter1_30_260_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_30_260_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_30_260_Closed_Text.style.display='none'; Codehighlighter1_30_260_Open_Image.style.display='inline'; Codehighlighter1_30_260_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;E&nbsp;next()&nbsp;</span><span id="Codehighlighter1_30_260_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span></span><span id="Codehighlighter1_30_260_Open_Text"><span style="font-size: 10pt"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;3</span></span><span style="font-size: 10pt"><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;checkForComodification();<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img id="Codehighlighter1_79_147_Open_Image" onclick="this.style.display='none'; Codehighlighter1_79_147_Open_Text.style.display='none'; Codehighlighter1_79_147_Closed_Image.style.display='inline'; Codehighlighter1_79_147_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_79_147_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_79_147_Closed_Text.style.display='none'; Codehighlighter1_79_147_Open_Image.style.display='inline'; Codehighlighter1_79_147_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_79_147_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span></span><span id="Codehighlighter1_79_147_Open_Text"><span style="font-size: 10pt"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E&nbsp;next&nbsp;</span><span style="color: #000000">=</span></span><span style="font-size: 10pt"><span style="color: #000000">&nbsp;get(cursor);<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastRet&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;cursor</span><span style="color: #000000">++</span></span><span style="font-size: 10pt"><span style="color: #000000">;<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span></span><span style="font-size: 10pt"><span style="color: #000000">&nbsp;next;<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img id="Codehighlighter1_184_257_Open_Image" onclick="this.style.display='none'; Codehighlighter1_184_257_Open_Text.style.display='none'; Codehighlighter1_184_257_Closed_Image.style.display='inline'; Codehighlighter1_184_257_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_184_257_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_184_257_Closed_Text.style.display='none'; Codehighlighter1_184_257_Open_Image.style.display='inline'; Codehighlighter1_184_257_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span><span style="font-size: 10pt"><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">(IndexOutOfBoundsException&nbsp;e)&nbsp;</span><span id="Codehighlighter1_184_257_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span></span><span id="Codehighlighter1_184_257_Open_Text"><span style="font-size: 10pt"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;9</span></span><span style="font-size: 10pt"><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;checkForComodification();<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span></span><span style="font-size: 10pt"><span style="color: #000000">&nbsp;NoSuchElementException();<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span><span style="color: #000000"><br />
</span><span style="font-size: 10pt"><span style="color: #008080">12</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span><span style="color: #000000"><br />
</span><span style="color: #008080"><span style="font-size: 10pt">13</span></span><span style="font-size: 10pt"><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">checkForComodification()方法：</span></span><span style="color: #008000"><br />
</span><span style="font-size: 10pt"><span style="color: #008080">15</span><span style="color: #008000"><img id="Codehighlighter1_329_418_Open_Image" onclick="this.style.display='none'; Codehighlighter1_329_418_Open_Text.style.display='none'; Codehighlighter1_329_418_Closed_Image.style.display='inline'; Codehighlighter1_329_418_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_329_418_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_329_418_Closed_Text.style.display='none'; Codehighlighter1_329_418_Open_Image.style.display='inline'; Codehighlighter1_329_418_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;checkForComodification()&nbsp;</span><span id="Codehighlighter1_329_418_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span></span><span id="Codehighlighter1_329_418_Open_Text"><span style="font-size: 10pt"><span style="color: #000000">{<br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(modCount&nbsp;</span><span style="color: #000000">!=</span></span><span style="font-size: 10pt"><span style="color: #000000">&nbsp;expectedModCount)<br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span></span><span style="font-size: 10pt"><span style="color: #000000">&nbsp;ConcurrentModificationException();<br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span><span style="color: #000000"><br />
</span><span style="color: #008080"><span style="font-size: 10pt">19</span></span><span style="font-size: 10pt"><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">20</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></span></div>
<span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; 在next方法的一开始显示调用了checkForComodification()方法（见第三行），在checkForComodification()方法中做的工作就是比较expectedModCount&nbsp;和modCount的值是否相等，如果不相等，就认为还有其他对象正在对当前的List进行操作，那个就会抛出ConcurrentModificationException异常。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 经过以上的分析，发现抛出ConcurrentModificationException异常处于调用next()方法时，比较expectedModCount&nbsp;和modCount的值，如果两个值不相等，就会抛出异常，然而在什么情况下会使expectedModCount&nbsp;和modCount的值不相等呢，只有在两个Itr同时对一个list进行操作的时候才会出现这样的问题，所以在以后的编码过程中在是由Iterator进行remove()时一定要考虑是否时多线程的，如果是请不要用Iterator进行remove（），而应该使用List的remove方法进行。 </span>
<img src ="http://www.blogjava.net/houlinyan/aggbug/189924.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/houlinyan/" target="_blank">linda</a> 2008-04-01 09:56 <a href="http://www.blogjava.net/houlinyan/archive/2008/04/01/189924.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>