<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Java-List on 计算机知识分享网</title><link>https://jiaochengziyuan.cn/categories/java-list/</link><description>Recent content in Java-List on 计算机知识分享网</description><generator>Hugo</generator><language>zh-CN</language><managingEditor>986945193@qq.com (David)</managingEditor><webMaster>986945193@qq.com (David)</webMaster><copyright>Copyright © 2014-至今, David.</copyright><lastBuildDate>Fri, 09 Dec 2022 10:40:29 +0800</lastBuildDate><follow_challenge><feedId>00000000000000000</feedId><userId>00000000000000000</userId></follow_challenge><atom:link href="https://jiaochengziyuan.cn/categories/java-list/index.xml" rel="self" type="application/rss+xml"/><item><title>【java-list】源码解析ArrayList的多线程相关原理</title><link>https://jiaochengziyuan.cn/p/java-list%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90arraylist%E7%9A%84%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%9B%B8%E5%85%B3%E5%8E%9F%E7%90%86/</link><pubDate>Fri, 09 Dec 2022 10:40:29 +0800</pubDate><author>986945193@qq.com (David)</author><guid>https://jiaochengziyuan.cn/p/java-list%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90arraylist%E7%9A%84%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%9B%B8%E5%85%B3%E5%8E%9F%E7%90%86/</guid><description>&lt;h5 id="一arraylist概述"&gt;一、&lt;code&gt;ArrayList&lt;/code&gt;概述&lt;/h5&gt;&#10;&lt;p&gt;&lt;code&gt;ArrayList&lt;/code&gt;是基于数组实现的，是一个动态的数字，可以自动扩容。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;ArrayList&lt;/code&gt;不是线程安全的，效率比较高，只能用于单线程的环境中，在多线程环境中可以使用&lt;code&gt;Collections.synchronizedList(List list)&lt;/code&gt;函数返回一个线程安全的&lt;code&gt;ArrayList&lt;/code&gt;集合，或者使用&lt;code&gt;concurrent&lt;/code&gt;并发包下的&lt;code&gt;CopyOnWriteArrayList&lt;/code&gt;。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;// 使用Collections.synchronizedList(List list)方法实现线程安全&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;List&lt;span style="color:#0550ae"&gt;&amp;lt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;list&lt;span style="color:#0550ae"&gt;=&lt;/span&gt;Collections&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;synchronizedList&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#cf222e"&gt;new&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;ArrayList&lt;span style="color:#0550ae"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;());&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id="二通过源码解析collectionssynchronizedlistlist-list方法如何实现线程安全"&gt;二、通过源码解析&lt;code&gt;Collections.synchronizedList（List list）&lt;/code&gt;方法如何实现线程安全？&lt;/h5&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;public&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;static&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;List&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#6639ba"&gt;synchronizedList&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;List&lt;span style="color:#fff"&gt; &lt;/span&gt;list1&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;return&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;((&lt;/span&gt;List&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;((&lt;/span&gt;list1&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;instanceof&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;RandomAccess&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#0550ae"&gt;?&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;new&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;SynchronizedRandomAccessList&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;list1&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;new&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;SynchronizedList&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;list1&lt;span style="color:#1f2328"&gt;)));&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;通过判断传入的&lt;code&gt;list&lt;/code&gt;类是否为&lt;code&gt;RandomAccess&lt;/code&gt;类，如果是则实例化&lt;code&gt;SynchronizedRandomAccessList&lt;/code&gt;，如果不是，则实例化&lt;code&gt;SynchronizedList&lt;/code&gt;。如果你传入的&lt;code&gt;list&lt;/code&gt;集合是&lt;code&gt;ArrayList&lt;/code&gt;或者&lt;code&gt;Vector&lt;/code&gt;。那么则是实例化&lt;code&gt;SynchronizedRandomAccessList&lt;/code&gt;。我们从源码可以查看原因：&lt;/p&gt;&#10;&lt;h6 id="arraylist集合源码"&gt;ArrayList集合源码：&lt;/h6&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;public&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;class&lt;/span&gt; &lt;span style="color:#1f2328"&gt;ArrayList&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;extends&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;AbstractList&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;implements&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;List&lt;span style="color:#1f2328"&gt;,&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;RandomAccess&lt;span style="color:#1f2328"&gt;,&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;Cloneable&lt;span style="color:#1f2328"&gt;,&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;Serializable&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h6 id="vector集合源码"&gt;Vector集合源码：&lt;/h6&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;public&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;class&lt;/span&gt; &lt;span style="color:#1f2328"&gt;Vector&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;extends&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;AbstractList&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;implements&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;List&lt;span style="color:#1f2328"&gt;,&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;RandomAccess&lt;span style="color:#1f2328"&gt;,&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;Cloneable&lt;span style="color:#1f2328"&gt;,&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;Serializable&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我们可以发现&lt;code&gt;ArrayList&lt;/code&gt;和&lt;code&gt;Vector&lt;/code&gt;集合两者都实现了&lt;code&gt;List&lt;/code&gt;和&lt;code&gt;RandomAccess&lt;/code&gt;接口。接下来看看&lt;code&gt;SynchronizedRandomAccessList&lt;/code&gt;类的实现：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;static&lt;/span&gt; &lt;span style="color:#cf222e"&gt;class&lt;/span&gt; SynchronizedRandomAccessList &lt;span style="color:#cf222e"&gt;extends&lt;/span&gt; SynchronizedList implements RandomAccess &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; public List subList&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;int i&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; int j&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Object obj &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; mutex&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;return&lt;/span&gt; new SynchronizedRandomAccessList&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;list&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;subList&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;i&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; j&lt;span style="color:#1f2328"&gt;),&lt;/span&gt; mutex&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; private Object writeReplace&lt;span style="color:#1f2328"&gt;()&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;return&lt;/span&gt; new SynchronizedList&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;list&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; private &lt;span style="color:#cf222e"&gt;static&lt;/span&gt; final long serialVersionUID &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#0550ae"&gt;1530674583602358482&lt;/span&gt;L&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; SynchronizedRandomAccessList&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;List list1&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; super&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;list1&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; SynchronizedRandomAccessList&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;List list1&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; Object obj&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; super&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;list1&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; obj&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;因为&lt;code&gt;SynchronizedRandomAccessList&lt;/code&gt;这个类继承自&lt;code&gt;SynchronizedList&lt;/code&gt;，而大部分方法都在&lt;code&gt;SynchronizedList&lt;/code&gt;中实现了，所以源码中只包含了很少的方法。我们来看看&lt;code&gt;SynchronizedList&lt;/code&gt;的源码：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;static&lt;/span&gt; &lt;span style="color:#cf222e"&gt;class&lt;/span&gt; SynchronizedList&lt;span style="color:#0550ae"&gt;&amp;lt;&lt;/span&gt;E&lt;span style="color:#0550ae"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;extends&lt;/span&gt; SynchronizedCollection&lt;span style="color:#0550ae"&gt;&amp;lt;&lt;/span&gt;E&lt;span style="color:#0550ae"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; implements List&lt;span style="color:#0550ae"&gt;&amp;lt;&lt;/span&gt;E&lt;span style="color:#0550ae"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; private &lt;span style="color:#cf222e"&gt;static&lt;/span&gt; final long serialVersionUID &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#0550ae"&gt;-&lt;/span&gt;&lt;span style="color:#0550ae"&gt;7754090372962971524&lt;/span&gt;L&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; final List&lt;span style="color:#0550ae"&gt;&amp;lt;&lt;/span&gt;E&lt;span style="color:#0550ae"&gt;&amp;gt;&lt;/span&gt; list&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; SynchronizedList&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;List&lt;span style="color:#0550ae"&gt;&amp;lt;&lt;/span&gt;E&lt;span style="color:#0550ae"&gt;&amp;gt;&lt;/span&gt; list&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; super&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;list&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; this&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;list &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; list&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; SynchronizedList&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;List&lt;span style="color:#0550ae"&gt;&amp;lt;&lt;/span&gt;E&lt;span style="color:#0550ae"&gt;&amp;gt;&lt;/span&gt; list&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; Object mutex&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; super&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;list&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; mutex&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; this&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;list &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; list&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; public boolean equals&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;Object o&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;if&lt;/span&gt; &lt;span style="color:#1f2328"&gt;(&lt;/span&gt;this &lt;span style="color:#0550ae"&gt;==&lt;/span&gt; o&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;return&lt;/span&gt; &lt;span style="color:#6a737d"&gt;true&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; synchronized &lt;span style="color:#1f2328"&gt;(&lt;/span&gt;mutex&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&lt;span style="color:#cf222e"&gt;return&lt;/span&gt; list&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;equals&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;o&lt;span style="color:#1f2328"&gt;);}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; public int hashCode&lt;span style="color:#1f2328"&gt;()&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; synchronized &lt;span style="color:#1f2328"&gt;(&lt;/span&gt;mutex&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&lt;span style="color:#cf222e"&gt;return&lt;/span&gt; list&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;hashCode&lt;span style="color:#1f2328"&gt;();}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; public E get&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;int index&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; synchronized &lt;span style="color:#1f2328"&gt;(&lt;/span&gt;mutex&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&lt;span style="color:#cf222e"&gt;return&lt;/span&gt; list&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;get&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;index&lt;span style="color:#1f2328"&gt;);}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; public E set&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;int index&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; E element&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; synchronized &lt;span style="color:#1f2328"&gt;(&lt;/span&gt;mutex&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&lt;span style="color:#cf222e"&gt;return&lt;/span&gt; list&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;set&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;index&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; element&lt;span style="color:#1f2328"&gt;);}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; public void add&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;int index&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; E element&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; synchronized &lt;span style="color:#1f2328"&gt;(&lt;/span&gt;mutex&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;list&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;add&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;index&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; element&lt;span style="color:#1f2328"&gt;);}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; public E remove&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;int index&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; synchronized &lt;span style="color:#1f2328"&gt;(&lt;/span&gt;mutex&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&lt;span style="color:#cf222e"&gt;return&lt;/span&gt; list&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;remove&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;index&lt;span style="color:#1f2328"&gt;);}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; public int indexOf&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;Object o&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; synchronized &lt;span style="color:#1f2328"&gt;(&lt;/span&gt;mutex&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&lt;span style="color:#cf222e"&gt;return&lt;/span&gt; list&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;indexOf&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;o&lt;span style="color:#1f2328"&gt;);}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; public int lastIndexOf&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;Object o&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; synchronized &lt;span style="color:#1f2328"&gt;(&lt;/span&gt;mutex&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&lt;span style="color:#cf222e"&gt;return&lt;/span&gt; list&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;lastIndexOf&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;o&lt;span style="color:#1f2328"&gt;);}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; public boolean addAll&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;int index&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; Collection&lt;span style="color:#0550ae"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#f6f8fa;background-color:#82071e"&gt;?&lt;/span&gt; &lt;span style="color:#cf222e"&gt;extends&lt;/span&gt; E&lt;span style="color:#0550ae"&gt;&amp;gt;&lt;/span&gt; c&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; synchronized &lt;span style="color:#1f2328"&gt;(&lt;/span&gt;mutex&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&lt;span style="color:#cf222e"&gt;return&lt;/span&gt; list&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;addAll&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;index&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; c&lt;span style="color:#1f2328"&gt;);}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; public ListIterator&lt;span style="color:#0550ae"&gt;&amp;lt;&lt;/span&gt;E&lt;span style="color:#0550ae"&gt;&amp;gt;&lt;/span&gt; listIterator&lt;span style="color:#1f2328"&gt;()&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;return&lt;/span&gt; list&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;listIterator&lt;span style="color:#1f2328"&gt;();&lt;/span&gt; &lt;span style="color:#0550ae"&gt;//&lt;/span&gt; Must be manually synched by user&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; public ListIterator&lt;span style="color:#0550ae"&gt;&amp;lt;&lt;/span&gt;E&lt;span style="color:#0550ae"&gt;&amp;gt;&lt;/span&gt; listIterator&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;int index&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;return&lt;/span&gt; list&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;listIterator&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;index&lt;span style="color:#1f2328"&gt;);&lt;/span&gt; &lt;span style="color:#0550ae"&gt;//&lt;/span&gt; Must be manually synched by user&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; public List&lt;span style="color:#0550ae"&gt;&amp;lt;&lt;/span&gt;E&lt;span style="color:#0550ae"&gt;&amp;gt;&lt;/span&gt; subList&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;int fromIndex&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; int toIndex&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; synchronized &lt;span style="color:#1f2328"&gt;(&lt;/span&gt;mutex&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;return&lt;/span&gt; new SynchronizedList&lt;span style="color:#0550ae"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;list&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;subList&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;fromIndex&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; toIndex&lt;span style="color:#1f2328"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mutex&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f6f8fa;background-color:#82071e"&gt;@&lt;/span&gt;Override&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; public void replaceAll&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;UnaryOperator&lt;span style="color:#0550ae"&gt;&amp;lt;&lt;/span&gt;E&lt;span style="color:#0550ae"&gt;&amp;gt;&lt;/span&gt; operator&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; synchronized &lt;span style="color:#1f2328"&gt;(&lt;/span&gt;mutex&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;list&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;replaceAll&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;operator&lt;span style="color:#1f2328"&gt;);}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f6f8fa;background-color:#82071e"&gt;@&lt;/span&gt;Override&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; public void sort&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;Comparator&lt;span style="color:#0550ae"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#f6f8fa;background-color:#82071e"&gt;?&lt;/span&gt; super E&lt;span style="color:#0550ae"&gt;&amp;gt;&lt;/span&gt; c&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; synchronized &lt;span style="color:#1f2328"&gt;(&lt;/span&gt;mutex&lt;span style="color:#1f2328"&gt;)&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;list&lt;span style="color:#0550ae"&gt;.&lt;/span&gt;sort&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;c&lt;span style="color:#1f2328"&gt;);}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以发现&lt;code&gt;SynchronizedList&lt;/code&gt;方法中地方都用到了同步锁，并且参数都是&lt;code&gt;mutex&lt;/code&gt;。我们通过点击&lt;code&gt;mutex&lt;/code&gt;字段进入到&lt;code&gt;SynchronizedCollection&lt;/code&gt;类中，可以得知&lt;code&gt;mutex&lt;/code&gt;是在&lt;code&gt;SynchronizedCollection&lt;/code&gt;类中定义的。我们继续查看&lt;code&gt;SynchronizedCollection&lt;/code&gt;部分源码：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;static class SynchronizedCollection&amp;lt;E&amp;gt; implements Collection&amp;lt;E&amp;gt;, Serializable {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; private static final long serialVersionUID = 3053995032091335093L;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; final Collection&amp;lt;E&amp;gt; c; // Backing Collection&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; final Object mutex; // Object on which to synchronize&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; SynchronizedCollection(Collection&amp;lt;E&amp;gt; c) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; if (c==null)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; throw new NullPointerException();&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; this.c = c;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mutex = this;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; SynchronizedCollection(Collection&amp;lt;E&amp;gt; c, Object mutex) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; this.c = c;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; this.mutex = mutex;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以发现其实我们调用&lt;code&gt;synchronizedList&lt;/code&gt;方法的使用，内部锁都是一样的，所以它可以实现线程的同步。&lt;/p&gt;&#10;&lt;h5 id="三通过源码解析copyonwritearraylist如何做到线程安全的"&gt;三、通过源码解析&lt;code&gt;CopyOnWriteArrayList&lt;/code&gt;如何做到线程安全的？&lt;/h5&gt;&#10;&lt;p&gt;&lt;code&gt;CopyOnWriteArrayList&lt;/code&gt;使用了一种叫写时复制的方法，当有新元素添加到&lt;code&gt;CopyOnWriteArrayList&lt;/code&gt;时，先从原有的数组中拷贝一份出来，然后在新的数组做写操作，写完之后，再将原来的数组引用指向到新数组。&lt;/p&gt;&#10;&lt;p&gt;当有新元素加入的时候，如下图，创建新数组，并往新数组中加入一个新元素,这个时候，&lt;code&gt;array&lt;/code&gt;这个引用仍然是指向原数组的。&#10; &lt;!-- raw HTML omitted --&gt;1list&lt;!-- raw HTML omitted --&gt; &#10;&lt;figure&#13;&#10; class="image-caption image-zoom-container"&#13;&#10;&gt;&#13;&#10; &#13;&#10; &lt;input&#13;&#10; type="checkbox"&#13;&#10; id="img-197a5cc6"&#13;&#10; class="image-zoom-toggle"&#13;&#10; aria-label="放大图片："&#13;&#10; /&gt;&#13;&#10; &lt;label&#13;&#10; for="img-197a5cc6"&#13;&#10; class="image-zoom-label"&#13;&#10; &gt;&#13;&#10; &lt;img&#13;&#10; src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=b86519fe33cb878a1f6b4c4f37319130&amp;amp;file=file.png"&#13;&#10; alt=""&#13;&#10; loading="lazy"&#13;&#10; class="zoomable-image"&#13;&#10; /&gt;&#13;&#10; &lt;/label&gt;&#13;&#10; &#13;&#10; &lt;label&#13;&#10; for="img-197a5cc6"&#13;&#10; class="image-zoom-overlay"&#13;&#10; &gt;&#13;&#10; &lt;img&#13;&#10; src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=b86519fe33cb878a1f6b4c4f37319130&amp;amp;file=file.png"&#13;&#10; alt=""&#13;&#10; class="zoomable-image"&#13;&#10; /&gt;&#13;&#10; &lt;/label&gt;&#13;&#10; &#13;&#10; &lt;figcaption&gt;&lt;/figcaption&gt;&#13;&#10;&lt;/figure&gt;&#13;&#10;&lt;/p&gt;&#10;&lt;p&gt;当元素在新数组添加成功后，将&lt;code&gt;array&lt;/code&gt;这个引用指向新数组。&#10; &lt;!-- raw HTML omitted --&gt;2list&lt;!-- raw HTML omitted --&gt; &#10;&lt;figure&#13;&#10; class="image-caption image-zoom-container"&#13;&#10;&gt;&#13;&#10; &#13;&#10; &lt;input&#13;&#10; type="checkbox"&#13;&#10; id="img-e26c6e14"&#13;&#10; class="image-zoom-toggle"&#13;&#10; aria-label="放大图片："&#13;&#10; /&gt;&#13;&#10; &lt;label&#13;&#10; for="img-e26c6e14"&#13;&#10; class="image-zoom-label"&#13;&#10; &gt;&#13;&#10; &lt;img&#13;&#10; src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=be3cac765c24433a767007fe330ae510&amp;amp;file=file.png"&#13;&#10; alt=""&#13;&#10; loading="lazy"&#13;&#10; class="zoomable-image"&#13;&#10; /&gt;&#13;&#10; &lt;/label&gt;&#13;&#10; &#13;&#10; &lt;label&#13;&#10; for="img-e26c6e14"&#13;&#10; class="image-zoom-overlay"&#13;&#10; &gt;&#13;&#10; &lt;img&#13;&#10; src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=be3cac765c24433a767007fe330ae510&amp;amp;file=file.png"&#13;&#10; alt=""&#13;&#10; class="zoomable-image"&#13;&#10; /&gt;&#13;&#10; &lt;/label&gt;&#13;&#10; &#13;&#10; &lt;figcaption&gt;&lt;/figcaption&gt;&#13;&#10;&lt;/figure&gt;&#13;&#10;&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;CopyOnWriteArrayList&lt;/code&gt;的整个&lt;code&gt;add&lt;/code&gt;操作都是在锁的保护下进行的。&#10;这样做是为了避免在多线程并发&lt;code&gt;add&lt;/code&gt;的时候，复制出多个副本出来,把数据搞乱了，导致最终的数组数据不是我们期望的。我们来看看&lt;code&gt;CopyOnWriteArrayList&lt;/code&gt;源码：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; transient final ReentrantLock lock = new ReentrantLock();&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; /** The array, accessed only via getArray/setArray. */&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; private volatile transient Object[] array;//保证了线程的可见性&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; public boolean add(E e) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; final ReentrantLock lock = this.lock;//ReentrantLock 保证了线程的可见性和顺序性，即保证了多线程安全。&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; //1、先加锁&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lock.lock();&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; try {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Object[] elements = getArray();&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; int len = elements.length;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Object[] newElements = Arrays.copyOf(elements, len + 1);////2、拷贝数组,在原先数组基础之上新建长度＋1的数组，并将原先数组当中的内容拷贝到新数组当中。&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; //3、将元素加入到新数组中&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; newElements[len] = e;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; //4、将array引用指向到新数组&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; setArray(newElements);//对新数组进行赋值&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; return true;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } finally {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lock.unlock();&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;由于所有的写操作都是在新数组进行的，这个时候如果有线程并发的写，则通过锁来控制，如果有线程并发的读，则分几种情况：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;如果写操作未完成，那么直接读取原数组的数据；&lt;/li&gt;&#10;&lt;li&gt;如果写操作完成，但是引用还未指向新数组，那么也是读取原数组数据；&lt;/li&gt;&#10;&lt;li&gt;如果写操作完成，并且引用已经指向了新的数组，那么直接从新数组中读取数据。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;可见，&lt;code&gt;CopyOnWriteArrayList&lt;/code&gt;的读操作是可以不用加锁的。&lt;/p&gt;&#10;&lt;h5 id="四collectionssynchronizedlist--copyonwritearraylist"&gt;四、&lt;code&gt;Collections.synchronizedList&lt;/code&gt; &amp;amp;&lt;code&gt; CopyOnWriteArrayList&lt;/code&gt;&lt;/h5&gt;&#10;&lt;p&gt;&lt;code&gt;CopyOnWriteArrayList&lt;/code&gt;和&lt;code&gt;Collections.synchronizedList&lt;/code&gt;是实现线程安全的列表的两种方式。两种实现方式分别针对不同情况有不同的性能表现，其中&lt;code&gt;CopyOnWriteArrayList&lt;/code&gt;的写操作性能较差，而多线程的读操作性能较好。而&lt;code&gt;Collections.synchronizedList&lt;/code&gt;的写操作性能比&lt;code&gt;CopyOnWriteArrayList&lt;/code&gt;在多线程操作的情况下要好很多，而读操作因为是采用了&lt;code&gt;synchronized&lt;/code&gt;关键字的方式，其读操作性能并不如&lt;code&gt;CopyOnWriteArrayList&lt;/code&gt;。因此在不同的应用场景下，应该选择不同的多线程安全实现类。&lt;/p&gt;&#10;</description></item><item><title>【java-list】源码解析多线程中list空指针和size大小异常问题</title><link>https://jiaochengziyuan.cn/p/java-list%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E5%A4%9A%E7%BA%BF%E7%A8%8B%E4%B8%ADlist%E7%A9%BA%E6%8C%87%E9%92%88%E5%92%8Csize%E5%A4%A7%E5%B0%8F%E5%BC%82%E5%B8%B8%E9%97%AE%E9%A2%98/</link><pubDate>Fri, 09 Dec 2022 10:36:11 +0800</pubDate><author>986945193@qq.com (David)</author><guid>https://jiaochengziyuan.cn/p/java-list%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E5%A4%9A%E7%BA%BF%E7%A8%8B%E4%B8%ADlist%E7%A9%BA%E6%8C%87%E9%92%88%E5%92%8Csize%E5%A4%A7%E5%B0%8F%E5%BC%82%E5%B8%B8%E9%97%AE%E9%A2%98/</guid><description>&lt;h4 id="问题描述"&gt;问题描述&lt;/h4&gt;&#10;&lt;p&gt;为了效率，使用&lt;code&gt;Stream&lt;/code&gt;并行流&lt;code&gt;parallelStream&lt;/code&gt;来遍历源&lt;code&gt;list&lt;/code&gt;往宿&lt;code&gt;list&lt;/code&gt;添加元素，后面在遍历宿&lt;code&gt;list（LinkedList）&lt;/code&gt;的时候会偶发性报&lt;code&gt;NullPointerException&lt;/code&gt;空指针异常或&lt;code&gt;list size&lt;/code&gt;大小异常。（如果宿&lt;code&gt;list&lt;/code&gt;使用的是&lt;code&gt;ArrayList&lt;/code&gt;，那么还可能会报&lt;code&gt;ArrayIndexOutOfBoundsException&lt;/code&gt;数组越界异常）&lt;/p&gt;&#10;&lt;h4 id="测试代码源码"&gt;测试代码源码&lt;/h4&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;package&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;com&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;david&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;jdk8&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;import&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;java&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;util&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;ArrayList&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;import&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;java&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;util&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;Iterator&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;import&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;java&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;util&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;LinkedList&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;import&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;java&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;util&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;List&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;/**&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt; * @author David Zheng&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt; * @date 2022/12/08&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt; * @email dmcxiaobing@foxmail.com&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt; * &amp;lt;p&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt; * 线程安全相关的&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt; */&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;public&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;class&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;ThreadSafeList&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;public&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;static&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;void&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#6639ba"&gt;main&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#1f2328"&gt;String&lt;/span&gt;&lt;span style="color:#1f2328"&gt;[]&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;args&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#57606a"&gt;//执行开始时间(记录耗时)&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;Long&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;start&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;=&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;System&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#6639ba"&gt;currentTimeMillis&lt;/span&gt;&lt;span style="color:#1f2328"&gt;();&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#57606a"&gt;//先造数据&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#57606a"&gt;//ArrayList和LinkedList选用:查询多用ArrayList增删多用LinkedList&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#57606a"&gt;//为了后面并行流parallelStream可以更快执行,这里选用ArrayList,因为流的可拆分性能上ArrayList比LinkedList好很多&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;List&lt;/span&gt;&lt;span style="color:#1f2328"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;Integer&lt;/span&gt;&lt;span style="color:#1f2328"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;sourceList&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;=&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;new&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;ArrayList&lt;/span&gt;&lt;span style="color:#1f2328"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#57606a"&gt;//可自行调整i大小测试&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;for&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#cf222e"&gt;int&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;i&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;=&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#0550ae"&gt;1&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;i&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#0550ae"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#0550ae"&gt;20&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;i&lt;/span&gt;&lt;span style="color:#0550ae"&gt;++&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;sourceList&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#6639ba"&gt;add&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#1f2328"&gt;i&lt;/span&gt;&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#57606a"&gt;//这里使用线程安全的并发容器ConcurrentLinkedQueue,配合并行流,防止多线程修改共享变量触发多线程安全问题&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;List&lt;/span&gt;&lt;span style="color:#1f2328"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;Integer&lt;/span&gt;&lt;span style="color:#1f2328"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;targetList&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;=&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;new&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;LinkedList&lt;/span&gt;&lt;span style="color:#1f2328"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;&lt;span style="color:#57606a"&gt;//遍历时可能会报空指针异常且size异常&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#57606a"&gt;//List&amp;lt;Integer&amp;gt; targetList = new ArrayList&amp;lt;&amp;gt;();//遍历时可能会报空指针异常且size异常&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#57606a"&gt;//解决方案&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#57606a"&gt;//ConcurrentLinkedQueue&amp;lt;Integer&amp;gt; targetList = new ConcurrentLinkedQueue&amp;lt;&amp;gt;();&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#57606a"&gt;//LinkedBlockingQueue&amp;lt;Integer&amp;gt; targetList = new LinkedBlockingQueue&amp;lt;&amp;gt;();&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#57606a"&gt;//CopyOnWriteArrayList&amp;lt;Integer&amp;gt; targetList = new CopyOnWriteArrayList&amp;lt;&amp;gt;();&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#57606a"&gt;//实际使用时尽量使用LongStream/ IntStream/DoubleStream 等原始数据流代替 Stream 来处理数字，&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#57606a"&gt;//以避免频繁拆装箱带来的额外开销要考虑流的操作流水线的总计算成本&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#57606a"&gt;//并行流内部使用了默认的 ForkJoinPool 线程池&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;try&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;sourceList&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#6639ba"&gt;parallelStream&lt;/span&gt;&lt;span style="color:#1f2328"&gt;().&lt;/span&gt;&lt;span style="color:#6639ba"&gt;forEach&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;item&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#0550ae"&gt;-&lt;/span&gt;&lt;span style="color:#1f2328"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;if&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#1f2328"&gt;item&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#0550ae"&gt;!=&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;null&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#57606a"&gt;//如果是ArrayList，多线程时可能会报数组越界异常&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;targetList&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#6639ba"&gt;add&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#1f2328"&gt;item&lt;/span&gt;&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;});&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#6639ba"&gt;catch&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#1f2328"&gt;Exception&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;e&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;System&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;out&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#6639ba"&gt;println&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;出现异常了&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;e&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#6639ba"&gt;printStackTrace&lt;/span&gt;&lt;span style="color:#1f2328"&gt;();&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;throw&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;e&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;Iterator&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;iterator&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;=&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;targetList&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#6639ba"&gt;iterator&lt;/span&gt;&lt;span style="color:#1f2328"&gt;();&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#6639ba"&gt;while&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#1f2328"&gt;iterator&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#6639ba"&gt;hasNext&lt;/span&gt;&lt;span style="color:#1f2328"&gt;())&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;try&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;Integer&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;item&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;=&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#1f2328"&gt;Integer&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;iterator&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#6639ba"&gt;next&lt;/span&gt;&lt;span style="color:#1f2328"&gt;();&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;System&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;out&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#6639ba"&gt;println&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#1f2328"&gt;item&lt;/span&gt;&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#6639ba"&gt;catch&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#1f2328"&gt;Exception&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;e&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;System&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;out&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#6639ba"&gt;println&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;出现异常了&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;e&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#6639ba"&gt;printStackTrace&lt;/span&gt;&lt;span style="color:#1f2328"&gt;();&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;throw&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;e&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#57606a"&gt;//执行结束时间&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;Long&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;end&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;=&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;System&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#6639ba"&gt;currentTimeMillis&lt;/span&gt;&lt;span style="color:#1f2328"&gt;();&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;System&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;out&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#6639ba"&gt;println&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;完成,本次任务耗时&amp;#34;&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#0550ae"&gt;+&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#1f2328"&gt;end&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#0550ae"&gt;-&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;start&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#0550ae"&gt;/&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0550ae"&gt;1000&lt;/span&gt;&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#0550ae"&gt;+&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;秒,targetList的size：&amp;#34;&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#0550ae"&gt;+&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;targetList&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#6639ba"&gt;size&lt;/span&gt;&lt;span style="color:#1f2328"&gt;());&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="运行结果"&gt;运行结果&lt;/h4&gt;&#10;&lt;p&gt;如果&lt;code&gt;list&lt;/code&gt;用的&lt;code&gt;LinkedList&lt;/code&gt; ，可能会出现以下情况（&lt;code&gt;NullPointerException&lt;/code&gt;空指针异常或&lt;code&gt;list size&lt;/code&gt;大小也有问题）&#10; &lt;!-- raw HTML omitted --&gt;LinkedList&lt;!-- raw HTML omitted --&gt; &#10;&lt;figure&#13;&#10; class="image-caption image-zoom-container"&#13;&#10;&gt;&#13;&#10; &#13;&#10; &lt;input&#13;&#10; type="checkbox"&#13;&#10; id="img-79915bbe"&#13;&#10; class="image-zoom-toggle"&#13;&#10; aria-label="放大图片："&#13;&#10; /&gt;&#13;&#10; &lt;label&#13;&#10; for="img-79915bbe"&#13;&#10; class="image-zoom-label"&#13;&#10; &gt;&#13;&#10; &lt;img&#13;&#10; src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=eb2cbd40f9dd5d981487429fbefa7a9e&amp;amp;file=file.png"&#13;&#10; alt=""&#13;&#10; loading="lazy"&#13;&#10; class="zoomable-image"&#13;&#10; /&gt;&#13;&#10; &lt;/label&gt;&#13;&#10; &#13;&#10; &lt;label&#13;&#10; for="img-79915bbe"&#13;&#10; class="image-zoom-overlay"&#13;&#10; &gt;&#13;&#10; &lt;img&#13;&#10; src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=eb2cbd40f9dd5d981487429fbefa7a9e&amp;amp;file=file.png"&#13;&#10; alt=""&#13;&#10; class="zoomable-image"&#13;&#10; /&gt;&#13;&#10; &lt;/label&gt;&#13;&#10; &#13;&#10; &lt;figcaption&gt;&lt;/figcaption&gt;&#13;&#10;&lt;/figure&gt;&#13;&#10;&lt;/p&gt;&#10;&lt;p&gt;如果&lt;code&gt;list&lt;/code&gt;用的&lt;code&gt;ArrayList&lt;/code&gt; ，除可能出现上述&lt;code&gt;LinkedList&lt;/code&gt;的问题，还可能会出现以下情况（&lt;code&gt;ArrayIndexOutOfBoundsException&lt;/code&gt;数组越界异常）&#10; &lt;!-- raw HTML omitted --&gt;ArrayList&lt;!-- raw HTML omitted --&gt; &#10;&lt;figure&#13;&#10; class="image-caption image-zoom-container"&#13;&#10;&gt;&#13;&#10; &#13;&#10; &lt;input&#13;&#10; type="checkbox"&#13;&#10; id="img-4802e420"&#13;&#10; class="image-zoom-toggle"&#13;&#10; aria-label="放大图片："&#13;&#10; /&gt;&#13;&#10; &lt;label&#13;&#10; for="img-4802e420"&#13;&#10; class="image-zoom-label"&#13;&#10; &gt;&#13;&#10; &lt;img&#13;&#10; src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=6a4cba9d237ae27fe33999f655ad956f&amp;amp;file=file.png"&#13;&#10; alt=""&#13;&#10; loading="lazy"&#13;&#10; class="zoomable-image"&#13;&#10; /&gt;&#13;&#10; &lt;/label&gt;&#13;&#10; &#13;&#10; &lt;label&#13;&#10; for="img-4802e420"&#13;&#10; class="image-zoom-overlay"&#13;&#10; &gt;&#13;&#10; &lt;img&#13;&#10; src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=6a4cba9d237ae27fe33999f655ad956f&amp;amp;file=file.png"&#13;&#10; alt=""&#13;&#10; class="zoomable-image"&#13;&#10; /&gt;&#13;&#10; &lt;/label&gt;&#13;&#10; &#13;&#10; &lt;figcaption&gt;&lt;/figcaption&gt;&#13;&#10;&lt;/figure&gt;&#13;&#10;&lt;/p&gt;&#10;&lt;h3 id="list用的linkedlist时-原因分析"&gt;&lt;code&gt;list&lt;/code&gt;用的&lt;code&gt;LinkedList&lt;/code&gt;时 原因分析：&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;先总结：&lt;code&gt;parallelStream&lt;/code&gt;并行流实际上是多线程操作，如果多线程操作共享变量就很容易出现线程安全问题。（&lt;code&gt;ArrayList&lt;/code&gt;和&lt;code&gt;LinkedList&lt;/code&gt;都是线程不安全的！）&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;不开启多线程的时候&lt;code&gt;targetList&lt;/code&gt;的&lt;code&gt;size&lt;/code&gt;一定是&lt;code&gt;sourceList&lt;/code&gt;的&lt;code&gt;size&lt;/code&gt;大小，而且不会出现空指针异常。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h6 id="这两个问题其实都和size这句话有关"&gt;这两个问题其实都和size++这句话有关&lt;/h6&gt;&#10;&lt;h4 id="1size大小为什么不是1000"&gt;1、size大小为什么不是1000&lt;/h4&gt;&#10;&lt;h6 id="分析源码"&gt;分析源码：&lt;/h6&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;add是尾插，源码如下&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;void linkLast(E e) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; final Node&amp;lt;E&amp;gt; l = last;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; final Node&amp;lt;E&amp;gt; newNode = new Node&amp;lt;&amp;gt;(l, e, null);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; last = newNode;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; if (l == null)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; first = newNode;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; else&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; l.next = newNode;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; size++;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; modCount++;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;模拟一个场景&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;size现在的值为100&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;线程a拿到了size大小100，此时cpu让出执行权给线程b&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;线程b拿到了size大小也为100&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;那么无论他们谁先加1，最后size的值会被101覆盖两次，导致size的大小不会是102&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="2-再次遍历target的时候为什么会报空指针异常问题"&gt;2、 再次遍历target的时候为什么会报空指针异常问题&lt;/h4&gt;&#10;&lt;p&gt;其实也和尾插法这段代码有关&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;模拟场景：&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;设现在的size为100&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;线程a拿到了链表尾部元素last 之后让出执行权给线程b&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;线程b也拿到了相同的last之后一直执行完了add操作，此时size = 101&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;线程a也执行了 l.next = newNode;覆盖了线程b的在size = 101 位置上的值，&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;之后也进行了size++的操作，size = 102&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;此时出现的问题就是size = 101 位置上的值被覆盖了两次，但是102位置上的值是null。&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;所以遍历的时候会报空指针异常。&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;因为last = newNode;这一步的重复覆盖，可以预测所有的null都会是链表末尾。（参考上面的图）&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="3--关于为什么foreach增强for循环为什么会报空指针的问题"&gt;3、 关于为什么foreach增强for循环为什么会报空指针的问题&lt;/h4&gt;&#10;&lt;p&gt;&lt;code&gt;Linkedlist&lt;/code&gt;的&lt;code&gt;foreach&lt;/code&gt;循环，是依赖&lt;code&gt;Iterator&lt;/code&gt;的，&lt;code&gt;LinkedList&lt;/code&gt;也有自己的迭代器，源码如下&#10; &lt;!-- raw HTML omitted --&gt;Iterator&lt;!-- raw HTML omitted --&gt; &#10;&lt;figure&#13;&#10; class="image-caption image-zoom-container"&#13;&#10;&gt;&#13;&#10; &#13;&#10; &lt;input&#13;&#10; type="checkbox"&#13;&#10; id="img-ad677449"&#13;&#10; class="image-zoom-toggle"&#13;&#10; aria-label="放大图片："&#13;&#10; /&gt;&#13;&#10; &lt;label&#13;&#10; for="img-ad677449"&#13;&#10; class="image-zoom-label"&#13;&#10; &gt;&#13;&#10; &lt;img&#13;&#10; src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=635e51fdd3e59e793b7d76022825db23&amp;amp;file=file.png"&#13;&#10; alt=""&#13;&#10; loading="lazy"&#13;&#10; class="zoomable-image"&#13;&#10; /&gt;&#13;&#10; &lt;/label&gt;&#13;&#10; &#13;&#10; &lt;label&#13;&#10; for="img-ad677449"&#13;&#10; class="image-zoom-overlay"&#13;&#10; &gt;&#13;&#10; &lt;img&#13;&#10; src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=635e51fdd3e59e793b7d76022825db23&amp;amp;file=file.png"&#13;&#10; alt=""&#13;&#10; class="zoomable-image"&#13;&#10; /&gt;&#13;&#10; &lt;/label&gt;&#13;&#10; &#13;&#10; &lt;figcaption&gt;&lt;/figcaption&gt;&#13;&#10;&lt;/figure&gt;&#13;&#10;&lt;/p&gt;&#10;&lt;p&gt;可以看出&lt;code&gt;hasnext&lt;/code&gt;的判断并不是&lt;code&gt;node.next != null&lt;/code&gt; 而是 &lt;code&gt;nextIndex &amp;lt; size&lt;/code&gt; 所以即使&lt;code&gt;null&lt;/code&gt;都在末尾也会在 &lt;code&gt;next = next.next&lt;/code&gt;的时候报空指针异常。&lt;/p&gt;&#10;&lt;h3 id="list用的arraylist时"&gt;&lt;code&gt;list&lt;/code&gt;用的&lt;code&gt;ArrayList&lt;/code&gt;时：&lt;/h3&gt;&#10;&lt;p&gt;其实也是和&lt;code&gt;size++&lt;/code&gt;有关，与&lt;code&gt;LinkedList&lt;/code&gt;不同的是由于实现尾插的方式不一致，所以导致&lt;code&gt;null&lt;/code&gt;可能在中间。（参考上面的图）&lt;/p&gt;&#10;&lt;h5 id="分析源码-1"&gt;分析源码：&lt;/h5&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;ArrayList的add方法如下：&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;public boolean add(E e) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ensureCapacityInternal(size + 1); &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; elementData[size++] = e;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; return true;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;线程不安全问题的关键在于这行代码：&lt;code&gt;elementData[size++] = e&lt;/code&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;其原子操作如下：&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1. elementData[size] = e&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2. 读取 size&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;3. size += 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在多线程环境下，当两个线程同时执行&lt;code&gt;ensureCapacityInternal(size + 1)&lt;/code&gt;得到了相同的&lt;code&gt;size&lt;/code&gt;（假设此时&lt;code&gt;size&lt;/code&gt;恰好为数组最后一位），没有触发扩容，此时线程A先一步执行完&lt;code&gt;size+1&lt;/code&gt;，而后线程B读取到这个新的&lt;code&gt;size&lt;/code&gt;，而后再次&lt;code&gt;size+1&lt;/code&gt;，此时就会出现数组越界异常。&lt;/p&gt;&#10;&lt;h4 id="解决办法"&gt;解决办法&lt;/h4&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;使用线程安全的ArrayList：CopyOnWriteArrayList&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;使用线程安全的LinkedList：ConcurrentLinkedQueue、LinkedBlockingQueue&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;让需要进行add操作的list，转换成线程安全的：&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;List&amp;lt;String&amp;gt; target = Collections.synchronizedList(new LinkedList&amp;lt;&amp;gt;())&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id="synchronizedlist"&gt;&lt;code&gt;SynchronizedList&lt;/code&gt;：&lt;/h5&gt;&#10;&lt;p&gt;&lt;code&gt;SynchronizedList&lt;/code&gt;是通过对读写方法使用&lt;code&gt;synchronized&lt;/code&gt;修饰来实现同步的，即便只是多个线程在读数据，也不能进行，如果是读比较多的场景下，会性能不高，所以适合读写均匀的情况。&lt;/p&gt;&#10;&lt;h5 id="concurrentlinkedqueuelinkedblockingqueue"&gt;&lt;code&gt;ConcurrentLinkedQueue&lt;/code&gt;、&lt;code&gt;LinkedBlockingQueue&lt;/code&gt;：&lt;/h5&gt;&#10;&lt;p&gt;&lt;code&gt;LinkedBlockingQueue&lt;/code&gt;是使用锁机制，&lt;code&gt;ConcurrentLinkedQueue&lt;/code&gt;是使用CAS算法，虽然&lt;code&gt;LinkedBlockingQueue&lt;/code&gt;的底层获取锁也是使用的CAS算法；&lt;/p&gt;&#10;&lt;p&gt;关于取元素，&lt;code&gt;ConcurrentLinkedQueue&lt;/code&gt;不支持阻塞去取元素，&lt;code&gt;LinkedBlockingQueue&lt;/code&gt;&#10;支持阻塞的&lt;code&gt;take()&lt;/code&gt;方法，如若大家需要&lt;code&gt;ConcurrentLinkedQueue&lt;/code&gt;的消费者产生阻塞效果，需要自行实现；&lt;/p&gt;&#10;&lt;p&gt;关于插入元素的性能，从字面上和代码简单的分析来看&lt;code&gt;ConcurrentLinkedQueue&lt;/code&gt;肯定是最快的，但是这个也要看具体的测试场景，我做了两个简单的demo做测试，测试的结果如下，两个的性能差不多，但在实际的使用过程中，尤其在多cpu的服务器上，有锁和无锁的差距便体现出来了，&lt;code&gt;ConcurrentLinkedQueue&lt;/code&gt;会比&lt;code&gt;LinkedBlockingQueue&lt;/code&gt;快很多。&lt;/p&gt;&#10;&lt;h5 id="copyonwritearraylist"&gt;&lt;code&gt;CopyOnWriteArrayList&lt;/code&gt;：&lt;/h5&gt;&#10;&lt;p&gt;&lt;code&gt;CopyOnWriteArrayList&lt;/code&gt;是读写分离的，只对写操作加锁，但是每次写操作(添加和删除元素等)时都会复制出一个新数组，完成修改后，然后将新数组设置到旧数组的引用上，所以在写比较多的情况下，会有很大的性能开销，所以适合读比较多的应用场景。&lt;/p&gt;&#10;</description></item></channel></rss>