Atomic包的使用

<div id="article_content" class="article_content csdn-tracking-statistics" data-pid="blog" data-mod="popu_307" data-dsm="post" style="overflow: hidden;">


<ul style="margin-right:0px; margin-bottom:10px; margin-left:0px; padding-left:32px; font-family:Helvetica,'Hiragino Sans GB',微软雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; widows:auto; margin-top:0px!important">
<li style="margin:0px 0px 5px">
<h4 id="wiz_toc_0" style="margin:0px 0px 10px; padding:0px; position:relative; font-size:17px"><a name="t0"></a><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
简介</font></font></h4>
<p style="margin-top:0px; margin-bottom:0px"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Java从JDK1.5开始提供了java.util.concurrent.atomic包,方便程序员在多线程环境下,无锁的进行原子操作。</font><font style="vertical-align: inherit;">原子变量的底层使用了处理器提供的原子指令,但是不同的CPU架构可能提供的原子指令不一样,也有可能需要某种形式的内部锁,所以该方法不能绝对保证线程不被阻塞。&nbsp;</font></font><br style="margin-top:0px"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
在Atomic包里一共有12个类,四种原子更新方式,分别是原子更新基本类型,原子更新数组,原子更新引用和原子更新字段。</font><font style="vertical-align: inherit;">Atomic包里的类基本都是使用Unsafe实现的包装类。</font></font></p>
</li><li style="margin:5px 0px">
<h4 id="wiz_toc_1" style="margin:0px 0px 10px; padding:0px; position:relative; font-size:17px"><a name="t1"></a><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
原子更新基本类型类</font></font></h4>
<p style="margin-top:0px; margin-bottom:0px"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">用于通过原子的方式更新基本类型,Atomic包提供了以下三个类:</font></font></p>
<ul style="margin:10px 0px; padding-left:32px">
<li style="margin:0px 0px 5px"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">AtomicBoolean:原子更新布尔类型。</font></font></li><li style="margin:5px 0px"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">AtomicInteger:原子更新整型。</font></font></li><li style="margin:5px 0px"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">AtomicLong:原子更新长整型。&nbsp;</font></font><br style="margin-top:0px"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
AtomicInteger的常用方法如下:&nbsp; </font></font><br><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
1、 int addAndGet(int delta) :以原子方式将输入的数值与实例中的值(AtomicInteger里的value)相加,并返回结果&nbsp; </font></font><br><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
2、boolean compareAndSet(int expect, int update) :如果输入的数值等于预期值,则以原子方式将该值设置为输入的值。&nbsp;</font></font><br><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
3、int getAndIncrement():以原子方式将当前值加1,注意:这里返回的是自增前的值。&nbsp;</font></font><br><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
4、int getAndSet(int newValue):以原子方式设置为newValue的值,并返回旧值。</font></font></li></ul>
</li></ul>
<pre class="prettyprint linenums prettyprinted" style="margin-top:10px; margin-bottom:10px; border:1px solid rgb(225,225,232); font-size:13px; line-height:19px; overflow:auto; padding:10px; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; widows:auto; background-color:rgb(247,247,249)" name="code"><div class="linenums" style="margin:0px; padding-left:30px!important; color:rgb(30,52,123)"><div class="L0" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="kwd" style="color:rgb(30,52,123); margin-top:0px">import</span><span class="pln" style="color:rgb(72,72,76)"> java</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">util</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">concurrent</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">atomic</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="typ" style="color:teal">AtomicInteger</span><span class="pun" style="color:rgb(147,161,161)">;</span></code></div><div class="L1" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent">&nbsp;</code></div><div class="L2" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="kwd" style="color:rgb(30,52,123); margin-top:0px">public</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">class</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="typ" style="color:teal">AtomicIntegerTest</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="pun" style="color:rgb(147,161,161)">{</span></code></div><div class="L3" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent">&nbsp;</code></div><div class="L4" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">    </span><span class="kwd" style="color:rgb(30,52,123)">static</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="typ" style="color:teal">AtomicInteger</span><span class="pln" style="color:rgb(72,72,76)"> ai </span><span class="pun" style="color:rgb(147,161,161)">=</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">new</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="typ" style="color:teal">AtomicInteger</span><span class="pun" style="color:rgb(147,161,161)">(</span><span class="lit" style="color:rgb(25,95,145)">1</span><span class="pun" style="color:rgb(147,161,161)">);</span></code></div><div class="L5" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent">&nbsp;</code></div><div class="L6" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">    </span><span class="kwd" style="color:rgb(30,52,123)">public</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">static</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">void</span><span class="pln" style="color:rgb(72,72,76)"> main</span><span class="pun" style="color:rgb(147,161,161)">(</span><span class="typ" style="color:teal">String</span><span class="pun" style="color:rgb(147,161,161)">[]</span><span class="pln" style="color:rgb(72,72,76)"> args</span><span class="pun" style="color:rgb(147,161,161)">)</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="pun" style="color:rgb(147,161,161)">{</span></code></div><div class="L7" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        </span><span class="typ" style="color:teal">System</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">out</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">println</span><span class="pun" style="color:rgb(147,161,161)">(</span><span class="pln" style="color:rgb(72,72,76)">ai</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">getAndIncrement</span><span class="pun" style="color:rgb(147,161,161)">());</span></code></div><div class="L8" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        </span><span class="typ" style="color:teal">System</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">out</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">println</span><span class="pun" style="color:rgb(147,161,161)">(</span><span class="pln" style="color:rgb(72,72,76)">ai</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">get</span><span class="pun" style="color:rgb(147,161,161)">());</span></code></div><div class="L9" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">    </span><span class="pun" style="color:rgb(147,161,161)">}</span></code></div><div class="L0" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent">&nbsp;</code></div><div class="L1" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pun" style="color:rgb(147,161,161); margin-top:0px">}</span></code></div></div></pre>
<p style="font-size:15px; margin-top:10px; margin-bottom:10px; font-family:Helvetica,'Hiragino Sans GB',微软雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; line-height:24px; widows:auto"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
得到结果为:</font></font></p>
<pre style="margin-top:10px; margin-bottom:10px; border:1px solid rgb(204,204,204); font-size:13px; line-height:19px; overflow:auto; padding:6px 10px; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; widows:auto; background-color:rgb(248,248,248)"><code style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent">1<font></font>
2<font></font>
</code></pre>
<ul style="margin:10px 0px; padding-left:32px; font-family:Helvetica,'Hiragino Sans GB',微软雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; widows:auto">
<li style="margin:0px 0px 5px">
<h4 id="wiz_toc_2" style="margin:0px 0px 10px; padding:0px; position:relative; font-size:17px"><a name="t2"></a><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
原子更新数组类</font></font></h4><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
通过原子的方式更新数组里的某个元素,Atomic包提供了以下三个类:</font></font></li><li style="margin:5px 0px"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">AtomicIntegerArray:原子更新整型数组里的元素。</font></font></li><li style="margin:5px 0px"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">AtomicLongArray:原子更新长整型数组里的元素。</font></font></li><li style="margin:5px 0px"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">AtomicReferenceArray:原子更新引用类型数组里的元素。</font></font></li></ul>
<p style="font-size:15px; margin-top:10px; margin-bottom:10px; font-family:Helvetica,'Hiragino Sans GB',微软雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; line-height:24px; widows:auto"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
AtomicIntegerArray类主要是提供原子的方式更新数组里的整型,其常用方法如下</font></font></p>
<ul style="margin:10px 0px; padding-left:32px; font-family:Helvetica,'Hiragino Sans GB',微软雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; widows:auto">
<li style="margin:0px 0px 5px"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">int addAndGet(int i, int delta):以原子方式将输入值与数组中索引i的元素相加。</font></font></li><li style="margin:5px 0px"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">boolean compareAndSet(int i, int expect, int update):如果当前值等于预期值,则以原子方式将数组位置i的元素设置成update值。</font></font></li></ul>
<pre class="prettyprint linenums prettyprinted" style="margin-top:10px; margin-bottom:10px; border:1px solid rgb(225,225,232); font-size:13px; line-height:19px; overflow:auto; padding:10px; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; widows:auto; background-color:rgb(247,247,249)" name="code"><div class="linenums" style="margin:0px; padding-left:30px!important; color:rgb(30,52,123)"><div class="L0" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="kwd" style="color:rgb(30,52,123); margin-top:0px">public</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">class</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="typ" style="color:teal">AtomicIntegerArrayTest</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="pun" style="color:rgb(147,161,161)">{</span></code></div><div class="L1" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent">&nbsp;</code></div><div class="L2" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">    </span><span class="kwd" style="color:rgb(30,52,123)">static</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">int</span><span class="pun" style="color:rgb(147,161,161)">[]</span><span class="pln" style="color:rgb(72,72,76)"> value </span><span class="pun" style="color:rgb(147,161,161)">=</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">new</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">int</span><span class="pun" style="color:rgb(147,161,161)">[]</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="pun" style="color:rgb(147,161,161)">{</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="lit" style="color:rgb(25,95,145)">1</span><span class="pun" style="color:rgb(147,161,161)">,</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="lit" style="color:rgb(25,95,145)">2</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="pun" style="color:rgb(147,161,161)">};</span></code></div><div class="L3" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent">&nbsp;</code></div><div class="L4" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">    </span><span class="kwd" style="color:rgb(30,52,123)">static</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="typ" style="color:teal">AtomicIntegerArray</span><span class="pln" style="color:rgb(72,72,76)"> ai </span><span class="pun" style="color:rgb(147,161,161)">=</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">new</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="typ" style="color:teal">AtomicIntegerArray</span><span class="pun" style="color:rgb(147,161,161)">(</span><span class="pln" style="color:rgb(72,72,76)">value</span><span class="pun" style="color:rgb(147,161,161)">);</span></code></div><div class="L5" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent">&nbsp;</code></div><div class="L6" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">    </span><span class="kwd" style="color:rgb(30,52,123)">public</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">static</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">void</span><span class="pln" style="color:rgb(72,72,76)"> main</span><span class="pun" style="color:rgb(147,161,161)">(</span><span class="typ" style="color:teal">String</span><span class="pun" style="color:rgb(147,161,161)">[]</span><span class="pln" style="color:rgb(72,72,76)"> args</span><span class="pun" style="color:rgb(147,161,161)">)</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="pun" style="color:rgb(147,161,161)">{</span></code></div><div class="L7" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        ai</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">getAndSet</span><span class="pun" style="color:rgb(147,161,161)">(</span><span class="lit" style="color:rgb(25,95,145)">0</span><span class="pun" style="color:rgb(147,161,161)">,</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="lit" style="color:rgb(25,95,145)">3</span><span class="pun" style="color:rgb(147,161,161)">);</span></code></div><div class="L8" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        </span><span class="typ" style="color:teal">System</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">out</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">println</span><span class="pun" style="color:rgb(147,161,161)">(</span><span class="pln" style="color:rgb(72,72,76)">ai</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">get</span><span class="pun" style="color:rgb(147,161,161)">(</span><span class="lit" style="color:rgb(25,95,145)">0</span><span class="pun" style="color:rgb(147,161,161)">));</span></code></div><div class="L9" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">                </span><span class="typ" style="color:teal">System</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">out</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">println</span><span class="pun" style="color:rgb(147,161,161)">(</span><span class="pln" style="color:rgb(72,72,76)">value</span><span class="pun" style="color:rgb(147,161,161)">[</span><span class="lit" style="color:rgb(25,95,145)">0</span><span class="pun" style="color:rgb(147,161,161)">]);</span></code></div><div class="L0" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">    </span><span class="pun" style="color:rgb(147,161,161)">}</span></code></div><div class="L1" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent">&nbsp;</code></div><div class="L2" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pun" style="color:rgb(147,161,161); margin-top:0px">}</span></code></div></div></pre>
<p style="font-size:15px; margin-top:10px; margin-bottom:10px; font-family:Helvetica,'Hiragino Sans GB',微软雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; line-height:24px; widows:auto"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
得到结果:</font></font></p>
<pre style="margin-top:10px; margin-bottom:10px; border:1px solid rgb(204,204,204); font-size:13px; line-height:19px; overflow:auto; padding:6px 10px; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; widows:auto; background-color:rgb(248,248,248)"><code style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent">3<font></font>
1<font></font>
</code></pre>
<ul style="margin:10px 0px; padding-left:32px; font-family:Helvetica,'Hiragino Sans GB',微软雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; widows:auto">
<li style="margin:0px 0px 5px">
<h4 id="wiz_toc_3" style="margin:0px 0px 10px; padding:0px; position:relative; font-size:17px"><a name="t3"></a><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
原子更新引用类型</font></font></h4>
<p style="margin-top:0px; margin-bottom:0px"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">原子更新基本类型的AtomicInteger,只能更新一个变量,如果要原子的更新多个变量,就需要使用这个原子更新引用类型提供的类。</font><font style="vertical-align: inherit;">Atomic包提供了以下三个类:</font></font></p>
</li><li style="margin:5px 0px">
<p style="margin-top:0px; margin-bottom:0px"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">AtomicReference:原子更新引用类型。</font></font></p>
</li><li style="margin:5px 0px"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">AtomicReferenceFieldUpdater:原子更新引用类型里的字段。</font></font></li><li style="margin:5px 0px"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">AtomicMarkableReference:原子更新带有标记位的引用类型。</font><font style="vertical-align: inherit;">可以原子的更新一个布尔类型的标记位和引用类型。</font><font style="vertical-align: inherit;">构造方法是AtomicMarkableReference(V initialRef, boolean initialMark)</font></font></li></ul>
<pre class="prettyprint linenums prettyprinted" style="margin-top:10px; margin-bottom:10px; border:1px solid rgb(225,225,232); font-size:13px; line-height:19px; overflow:auto; padding:10px; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; widows:auto; background-color:rgb(247,247,249)" name="code"><div class="linenums" style="margin:0px; padding-left:30px!important; color:rgb(30,52,123)"><div class="L0" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="kwd" style="color:rgb(30,52,123); margin-top:0px">public</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">class</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="typ" style="color:teal">AtomicReferenceTest</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="pun" style="color:rgb(147,161,161)">{</span></code></div><div class="L1" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent">&nbsp;</code></div><div class="L2" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">    </span><span class="kwd" style="color:rgb(30,52,123)">public</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">static</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="typ" style="color:teal">AtomicReference</span><span class="pun" style="color:rgb(147,161,161)">&lt;</span><span class="pln" style="color:rgb(72,72,76)">user</span><span class="pun" style="color:rgb(147,161,161)">&gt;</span><span class="pln" style="color:rgb(72,72,76)"> atomicUserRef </span><span class="pun" style="color:rgb(147,161,161)">=</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">new</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="typ" style="color:teal">AtomicReference</span><span class="pun" style="color:rgb(147,161,161)">&lt;/</span><span class="pln" style="color:rgb(72,72,76)">user</span><span class="pun" style="color:rgb(147,161,161)">&gt;&lt;</span><span class="pln" style="color:rgb(72,72,76)">user</span><span class="pun" style="color:rgb(147,161,161)">&gt;();</span></code></div><div class="L3" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent">&nbsp;</code></div><div class="L4" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">    </span><span class="kwd" style="color:rgb(30,52,123)">public</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">static</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">void</span><span class="pln" style="color:rgb(72,72,76)"> main</span><span class="pun" style="color:rgb(147,161,161)">(</span><span class="typ" style="color:teal">String</span><span class="pun" style="color:rgb(147,161,161)">[]</span><span class="pln" style="color:rgb(72,72,76)"> args</span><span class="pun" style="color:rgb(147,161,161)">)</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="pun" style="color:rgb(147,161,161)">{</span></code></div><div class="L5" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        </span><span class="typ" style="color:teal">User</span><span class="pln" style="color:rgb(72,72,76)"> user </span><span class="pun" style="color:rgb(147,161,161)">=</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">new</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="typ" style="color:teal">User</span><span class="pun" style="color:rgb(147,161,161)">(</span><span class="str" style="color:rgb(221,17,68)">"conan"</span><span class="pun" style="color:rgb(147,161,161)">,</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="lit" style="color:rgb(25,95,145)">15</span><span class="pun" style="color:rgb(147,161,161)">);</span></code></div><div class="L6" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        atomicUserRef</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">set</span><span class="pun" style="color:rgb(147,161,161)">(</span><span class="pln" style="color:rgb(72,72,76)">user</span><span class="pun" style="color:rgb(147,161,161)">);</span></code></div><div class="L7" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        </span><span class="typ" style="color:teal">User</span><span class="pln" style="color:rgb(72,72,76)"> updateUser </span><span class="pun" style="color:rgb(147,161,161)">=</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">new</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="typ" style="color:teal">User</span><span class="pun" style="color:rgb(147,161,161)">(</span><span class="str" style="color:rgb(221,17,68)">"Shinichi"</span><span class="pun" style="color:rgb(147,161,161)">,</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="lit" style="color:rgb(25,95,145)">17</span><span class="pun" style="color:rgb(147,161,161)">);</span></code></div><div class="L8" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        atomicUserRef</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">compareAndSet</span><span class="pun" style="color:rgb(147,161,161)">(</span><span class="pln" style="color:rgb(72,72,76)">user</span><span class="pun" style="color:rgb(147,161,161)">,</span><span class="pln" style="color:rgb(72,72,76)"> updateUser</span><span class="pun" style="color:rgb(147,161,161)">);</span></code></div><div class="L9" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        </span><span class="typ" style="color:teal">System</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">out</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">println</span><span class="pun" style="color:rgb(147,161,161)">(</span><span class="pln" style="color:rgb(72,72,76)">atomicUserRef</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">get</span><span class="pun" style="color:rgb(147,161,161)">().</span><span class="pln" style="color:rgb(72,72,76)">getName</span><span class="pun" style="color:rgb(147,161,161)">());</span></code></div><div class="L0" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        </span><span class="typ" style="color:teal">System</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">out</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">println</span><span class="pun" style="color:rgb(147,161,161)">(</span><span class="pln" style="color:rgb(72,72,76)">atomicUserRef</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">get</span><span class="pun" style="color:rgb(147,161,161)">().</span><span class="pln" style="color:rgb(72,72,76)">getOld</span><span class="pun" style="color:rgb(147,161,161)">());</span></code></div><div class="L1" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">    </span><span class="pun" style="color:rgb(147,161,161)">}</span></code></div><div class="L2" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent">&nbsp;</code></div><div class="L3" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">    </span><span class="kwd" style="color:rgb(30,52,123)">static</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">class</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="typ" style="color:teal">User</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="pun" style="color:rgb(147,161,161)">{</span></code></div><div class="L4" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        </span><span class="kwd" style="color:rgb(30,52,123)">private</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="typ" style="color:teal">String</span><span class="pln" style="color:rgb(72,72,76)"> name</span><span class="pun" style="color:rgb(147,161,161)">;</span></code></div><div class="L5" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        </span><span class="kwd" style="color:rgb(30,52,123)">private</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">int</span><span class="pln" style="color:rgb(72,72,76)"> old</span><span class="pun" style="color:rgb(147,161,161)">;</span></code></div><div class="L6" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent">&nbsp;</code></div><div class="L7" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        </span><span class="kwd" style="color:rgb(30,52,123)">public</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="typ" style="color:teal">User</span><span class="pun" style="color:rgb(147,161,161)">(</span><span class="typ" style="color:teal">String</span><span class="pln" style="color:rgb(72,72,76)"> name</span><span class="pun" style="color:rgb(147,161,161)">,</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">int</span><span class="pln" style="color:rgb(72,72,76)"> old</span><span class="pun" style="color:rgb(147,161,161)">)</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="pun" style="color:rgb(147,161,161)">{</span></code></div><div class="L8" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">            </span><span class="kwd" style="color:rgb(30,52,123)">this</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">name </span><span class="pun" style="color:rgb(147,161,161)">=</span><span class="pln" style="color:rgb(72,72,76)"> name</span><span class="pun" style="color:rgb(147,161,161)">;</span></code></div><div class="L9" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">            </span><span class="kwd" style="color:rgb(30,52,123)">this</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">old </span><span class="pun" style="color:rgb(147,161,161)">=</span><span class="pln" style="color:rgb(72,72,76)"> old</span><span class="pun" style="color:rgb(147,161,161)">;</span></code></div><div class="L0" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        </span><span class="pun" style="color:rgb(147,161,161)">}</span></code></div><div class="L1" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent">&nbsp;</code></div><div class="L2" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        </span><span class="kwd" style="color:rgb(30,52,123)">public</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="typ" style="color:teal">String</span><span class="pln" style="color:rgb(72,72,76)"> getName</span><span class="pun" style="color:rgb(147,161,161)">()</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="pun" style="color:rgb(147,161,161)">{</span></code></div><div class="L3" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">            </span><span class="kwd" style="color:rgb(30,52,123)">return</span><span class="pln" style="color:rgb(72,72,76)"> name</span><span class="pun" style="color:rgb(147,161,161)">;</span></code></div><div class="L4" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        </span><span class="pun" style="color:rgb(147,161,161)">}</span></code></div><div class="L5" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent">&nbsp;</code></div><div class="L6" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        </span><span class="kwd" style="color:rgb(30,52,123)">public</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">int</span><span class="pln" style="color:rgb(72,72,76)"> getOld</span><span class="pun" style="color:rgb(147,161,161)">()</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="pun" style="color:rgb(147,161,161)">{</span></code></div><div class="L7" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">            </span><span class="kwd" style="color:rgb(30,52,123)">return</span><span class="pln" style="color:rgb(72,72,76)"> old</span><span class="pun" style="color:rgb(147,161,161)">;</span></code></div><div class="L8" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        </span><span class="pun" style="color:rgb(147,161,161)">}</span></code></div><div class="L9" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">    </span><span class="pun" style="color:rgb(147,161,161)">}</span></code></div><div class="L0" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pun" style="color:rgb(147,161,161); margin-top:0px">}</span></code></div></div></pre>
<p style="font-size:15px; margin-top:10px; margin-bottom:10px; font-family:Helvetica,'Hiragino Sans GB',微软雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; line-height:24px; widows:auto"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
得到结果:</font></font></p>
<pre style="margin-top:10px; margin-bottom:10px; border:1px solid rgb(204,204,204); font-size:13px; line-height:19px; overflow:auto; padding:6px 10px; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; widows:auto; background-color:rgb(248,248,248)"><code style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent">Shinichi<font></font>
17<font></font>
</code></pre>
<ul style="margin:10px 0px; padding-left:32px; font-family:Helvetica,'Hiragino Sans GB',微软雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; widows:auto">
<li style="margin:0px 0px 5px">
<h4 id="wiz_toc_4" style="margin:0px 0px 10px; padding:0px; position:relative; font-size:17px"><a name="t4"></a><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
原子更新字段类</font></font></h4>
<p style="margin-top:0px; margin-bottom:0px"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">如果我们只需要某个类里的某个字段,那么就需要使用原子更新字段类,Atomic包提供了以下三个类:</font></font></p>
</li><li style="margin:5px 0px">
<p style="margin-top:0px; margin-bottom:0px"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">AtomicIntegerFieldUpdater:原子更新整型的字段的更新器。</font></font></p>
</li><li style="margin:5px 0px"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">AtomicLongFieldUpdater:原子更新长整型字段的更新器。</font></font></li><li style="margin:5px 0px"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">AtomicStampedReference:原子更新带有版本号的引用类型。</font><font style="vertical-align: inherit;">该类将整数值与引用关联起来,可用于原子的更数据和数据的版本号,可以解决使用CAS进行原子更新时,可能出现的ABA问题。</font><font style="vertical-align: inherit;">(后面专门说)&nbsp; </font></font><br style="margin-top:0px"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
原子更新字段类都是抽象类,每次使用都时候必须使用静态方法newUpdater创建一个更新器。</font><font style="vertical-align: inherit;">原子更新类的字段的必须使用public volatile修饰符。</font><font style="vertical-align: inherit;">AtomicIntegerFieldUpdater的例子代码如下:</font></font></li></ul>
<pre class="prettyprint linenums prettyprinted" style="margin-top:10px; margin-bottom:10px; border:1px solid rgb(225,225,232); font-size:13px; line-height:19px; overflow:auto; padding:10px; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; widows:auto; background-color:rgb(247,247,249)" name="code"><div class="linenums" style="margin:0px; padding-left:30px!important; color:rgb(30,52,123)"><div class="L0" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="kwd" style="color:rgb(30,52,123); margin-top:0px">public</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">class</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="typ" style="color:teal">AtomicIntegerFieldUpdaterTest</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="pun" style="color:rgb(147,161,161)">{</span></code></div><div class="L1" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent">&nbsp;</code></div><div class="L2" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">    </span><span class="kwd" style="color:rgb(30,52,123)">private</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">static</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="typ" style="color:teal">AtomicIntegerFieldUpdater</span><span class="pun" style="color:rgb(147,161,161)">&lt;</span><span class="typ" style="color:teal">User</span><span class="pun" style="color:rgb(147,161,161)">&gt;</span><span class="pln" style="color:rgb(72,72,76)"> a </span><span class="pun" style="color:rgb(147,161,161)">=</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="typ" style="color:teal">AtomicIntegerFieldUpdater</span></code></div><div class="L3" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">            </span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">newUpdater</span><span class="pun" style="color:rgb(147,161,161)">(</span><span class="typ" style="color:teal">User</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="kwd" style="color:rgb(30,52,123)">class</span><span class="pun" style="color:rgb(147,161,161)">,</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="str" style="color:rgb(221,17,68)">"old"</span><span class="pun" style="color:rgb(147,161,161)">);</span></code></div><div class="L4" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent">&nbsp;</code></div><div class="L5" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">    </span><span class="kwd" style="color:rgb(30,52,123)">public</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">static</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">void</span><span class="pln" style="color:rgb(72,72,76)"> main</span><span class="pun" style="color:rgb(147,161,161)">(</span><span class="typ" style="color:teal">String</span><span class="pun" style="color:rgb(147,161,161)">[]</span><span class="pln" style="color:rgb(72,72,76)"> args</span><span class="pun" style="color:rgb(147,161,161)">)</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="pun" style="color:rgb(147,161,161)">{</span></code></div><div class="L6" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        </span><span class="typ" style="color:teal">User</span><span class="pln" style="color:rgb(72,72,76)"> conan </span><span class="pun" style="color:rgb(147,161,161)">=</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">new</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="typ" style="color:teal">User</span><span class="pun" style="color:rgb(147,161,161)">(</span><span class="str" style="color:rgb(221,17,68)">"conan"</span><span class="pun" style="color:rgb(147,161,161)">,</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="lit" style="color:rgb(25,95,145)">10</span><span class="pun" style="color:rgb(147,161,161)">);</span></code></div><div class="L7" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        </span><span class="typ" style="color:teal">System</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">out</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">println</span><span class="pun" style="color:rgb(147,161,161)">(</span><span class="pln" style="color:rgb(72,72,76)">a</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">getAndIncrement</span><span class="pun" style="color:rgb(147,161,161)">(</span><span class="pln" style="color:rgb(72,72,76)">conan</span><span class="pun" style="color:rgb(147,161,161)">));</span></code></div><div class="L8" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        </span><span class="typ" style="color:teal">System</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">out</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">println</span><span class="pun" style="color:rgb(147,161,161)">(</span><span class="pln" style="color:rgb(72,72,76)">a</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">get</span><span class="pun" style="color:rgb(147,161,161)">(</span><span class="pln" style="color:rgb(72,72,76)">conan</span><span class="pun" style="color:rgb(147,161,161)">));</span></code></div><div class="L9" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">    </span><span class="pun" style="color:rgb(147,161,161)">}</span></code></div><div class="L0" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent">&nbsp;</code></div><div class="L1" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">    </span><span class="kwd" style="color:rgb(30,52,123)">public</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">static</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">class</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="typ" style="color:teal">User</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="pun" style="color:rgb(147,161,161)">{</span></code></div><div class="L2" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        </span><span class="kwd" style="color:rgb(30,52,123)">private</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="typ" style="color:teal">String</span><span class="pln" style="color:rgb(72,72,76)"> name</span><span class="pun" style="color:rgb(147,161,161)">;</span></code></div><div class="L3" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        </span><span class="kwd" style="color:rgb(30,52,123)">public</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">volatile</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">int</span><span class="pln" style="color:rgb(72,72,76)"> old</span><span class="pun" style="color:rgb(147,161,161)">;</span></code></div><div class="L4" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent">&nbsp;</code></div><div class="L5" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        </span><span class="kwd" style="color:rgb(30,52,123)">public</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="typ" style="color:teal">User</span><span class="pun" style="color:rgb(147,161,161)">(</span><span class="typ" style="color:teal">String</span><span class="pln" style="color:rgb(72,72,76)"> name</span><span class="pun" style="color:rgb(147,161,161)">,</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">int</span><span class="pln" style="color:rgb(72,72,76)"> old</span><span class="pun" style="color:rgb(147,161,161)">)</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="pun" style="color:rgb(147,161,161)">{</span></code></div><div class="L6" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">            </span><span class="kwd" style="color:rgb(30,52,123)">this</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">name </span><span class="pun" style="color:rgb(147,161,161)">=</span><span class="pln" style="color:rgb(72,72,76)"> name</span><span class="pun" style="color:rgb(147,161,161)">;</span></code></div><div class="L7" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">            </span><span class="kwd" style="color:rgb(30,52,123)">this</span><span class="pun" style="color:rgb(147,161,161)">.</span><span class="pln" style="color:rgb(72,72,76)">old </span><span class="pun" style="color:rgb(147,161,161)">=</span><span class="pln" style="color:rgb(72,72,76)"> old</span><span class="pun" style="color:rgb(147,161,161)">;</span></code></div><div class="L8" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        </span><span class="pun" style="color:rgb(147,161,161)">}</span></code></div><div class="L9" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent">&nbsp;</code></div><div class="L0" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        </span><span class="kwd" style="color:rgb(30,52,123)">public</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="typ" style="color:teal">String</span><span class="pln" style="color:rgb(72,72,76)"> getName</span><span class="pun" style="color:rgb(147,161,161)">()</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="pun" style="color:rgb(147,161,161)">{</span></code></div><div class="L1" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">            </span><span class="kwd" style="color:rgb(30,52,123)">return</span><span class="pln" style="color:rgb(72,72,76)"> name</span><span class="pun" style="color:rgb(147,161,161)">;</span></code></div><div class="L2" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        </span><span class="pun" style="color:rgb(147,161,161)">}</span></code></div><div class="L3" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent">&nbsp;</code></div><div class="L4" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        </span><span class="kwd" style="color:rgb(30,52,123)">public</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="kwd" style="color:rgb(30,52,123)">int</span><span class="pln" style="color:rgb(72,72,76)"> getOld</span><span class="pun" style="color:rgb(147,161,161)">()</span><span class="pln" style="color:rgb(72,72,76)"> </span><span class="pun" style="color:rgb(147,161,161)">{</span></code></div><div class="L5" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">            </span><span class="kwd" style="color:rgb(30,52,123)">return</span><span class="pln" style="color:rgb(72,72,76)"> old</span><span class="pun" style="color:rgb(147,161,161)">;</span></code></div><div class="L6" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">        </span><span class="pun" style="color:rgb(147,161,161)">}</span></code></div><div class="L7" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pln" style="color:rgb(72,72,76); margin-top:0px">    </span><span class="pun" style="color:rgb(147,161,161)">}</span></code></div><div class="L8" style="margin:0px; color:rgb(190,190,197); line-height:18px; padding-left:12px!important; list-style-type:decimal!important"><code class="language-java" style="margin:0px; padding:0px; border:none; word-wrap:break-word; font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace; max-width:100%; background-color:transparent"><span class="pun" style="color:rgb(147,161,161); margin-top:0px">}</span></code></div></div></pre>
<p style="font-size:15px; margin-top:10px; margin-bottom:10px; font-family:Helvetica,'Hiragino Sans GB',微软雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; line-height:24px; widows:auto"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
得到结果:10 11</font></font></p>
<ul style="margin-top:10px; margin-right:0px; margin-left:0px; padding-left:32px; font-family:Helvetica,'Hiragino Sans GB',微软雅黑,'Microsoft YaHei UI',SimSun,SimHei,arial,sans-serif; font-size:15px; line-height:24px; widows:auto; margin-bottom:0px!important">
<li style="margin:0px 0px 5px">
<h4 id="wiz_toc_5" style="margin:0px 0px 10px; padding:0px; position:relative; font-size:17px"><a name="t5"></a><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
ABA问题</font></font></h4><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
在运用CAS做Lock-Free操作中有一个经典的ABA问题:&nbsp; </font></font><br><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
线程1准备用CAS将变量的值由A替换为B,在此之前,线程2将变量的值由A替换为C,又由C替换为A,然后线程1执行CAS时发现变量的值仍然为A,所以CAS成功。</font><font style="vertical-align: inherit;">但实际上这时的现场已经和最初不同了,尽管CAS成功,但可能存在潜藏的问题,例如下面的例子:&nbsp; </font></font><br>
<img src="file:///D:/用户目录/Documents/My%20Knowledge/temp/./e982b9bd-f874-4289-94b1-43de21976365_4_files/ABA-1.png" alt="" title="" style="max-width:100%">&nbsp;<br><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
现有一个用单向链表实现的堆栈,栈顶为A,这时线程T1已经知道A.next为B,然后希望用CAS将栈顶替换为B:&nbsp; </font></font><br>
<img src="file:///D:/用户目录/Documents/My%20Knowledge/temp/./e982b9bd-f874-4289-94b1-43de21976365_4_files/ABA-2.png" alt="" title="" style="max-width:100%">&nbsp;<br><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
此时轮到线程T1执行CAS操作,检测发现栈顶仍为A,所以CAS成功,栈顶变为B,但实际上B .next为null,所以此时的情况变为:&nbsp; </font></font><br>
<img src="file:///D:/用户目录/Documents/My%20Knowledge/temp/./e982b9bd-f874-4289-94b1-43de21976365_4_files/ABA-3.png" alt="" title="" style="max-width:100%">&nbsp;<br><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
其中堆栈中只有B一个元素,C和D组成的链表不再存在于堆栈中,平白无故就把C、D丢掉了。&nbsp;</font></font><br><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
以上就是由于ABA问题带来的隐患,各种乐观锁的实现中通常都会用版本戳version来对记录或对象标记,避免并发操作带来的问题,在Java中,AtomicStampedReference也实现了这个作用,它通过包装[E,Integer]的元组来对对象标记版本戳stamp,从而避免ABA问题。</font><font style="vertical-align: inherit;">(这里我本人也不是特别的理解它具体怎么实现的)</font></font></li></ul>
   
</div>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值