<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>变量 on 庞玉栋个人博客</title><link>https://pangyd.com/tags/%E5%8F%98%E9%87%8F/</link><description>Recent content in 变量 on 庞玉栋个人博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Fri, 11 Aug 2017 20:12:04 +0800</lastBuildDate><atom:link href="https://pangyd.com/tags/%E5%8F%98%E9%87%8F/index.xml" rel="self" type="application/rss+xml"/><item><title>转载自【 Java编程精选】深入理解 Java final 变量的内存模型</title><link>https://pangyd.com/post/52-java-java-final/</link><pubDate>Fri, 11 Aug 2017 22:11:15 +0800</pubDate><guid>https://pangyd.com/post/52-java-java-final/</guid><description>&lt;p>对于 final 域，编译器和处理器要遵守两个重排序规则：&lt;/p>&lt;ul class="list-paddingleft-2">&lt;li>&lt;p>在构造函数内对一个 final 域的写，与随后把这个构造对象的引用赋值给一个变量，这两个操作之间不能重排序&lt;/p>&lt;/li>&lt;li>&lt;p>初次读一个包含 final 域的对象的引用，与随后初次读这个 final 域，这两个操作之间不能重排序&lt;/p>&lt;/li>&lt;/ul>&lt;p>举个例子：&lt;/p>&lt;table cellpadding="0" cellspacing="0" width="620" height="NaN" class="layui-table">&lt;tbody>&lt;tr>&lt;td class="" width="NaN" height="NaN">&lt;div class="" style="text-align: right">1&lt;/div>&lt;div class="" style="text-align: right">2&lt;/div>&lt;div class="" style="text-align: right">3&lt;/div>&lt;div class="" style="text-align: right">4&lt;/div>&lt;div class="" style="text-align: right">5&lt;/div>&lt;div class="" style="text-align: right">6&lt;/div>&lt;div class="" style="text-align: right">7&lt;/div>&lt;div class="" style="text-align: right">8&lt;/div>&lt;div class="" style="text-align: right">9&lt;/div>&lt;div class="" style="text-align: right">10&lt;/div>&lt;div class="" style="text-align: right">11&lt;/div>&lt;div class="" style="text-align: right">12&lt;/div>&lt;div class="" style="text-align: right">13&lt;/div>&lt;div class="" style="text-align: right">14&lt;/div>&lt;div class="" style="text-align: right">15&lt;/div>&lt;div class="" style="text-align: right">16&lt;/div>&lt;div class="" style="text-align: right">17&lt;/div>&lt;div class="" style="text-align: right">18&lt;/div>&lt;div class="" style="text-align: right">19&lt;/div>&lt;div class="" style="text-align: right">20&lt;/div>&lt;/td>&lt;td class="" width="585" height="NaN">&lt;div class="">&lt;code class="">public&lt;/code> &lt;code class="">class&lt;/code> &lt;code class="">FinalExample {&lt;/code>&lt;/div>&lt;div class="">&lt;code class="">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code>&lt;code class="">int&lt;/code> &lt;code class="">i;&lt;/code>&lt;code class="">// 普通变量&lt;/code>&lt;/div>&lt;div class="">&lt;code class="">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code>&lt;code class="">final&lt;/code> &lt;code class="">int&lt;/code> &lt;code class="">j;&lt;/code>&lt;code class="">// final 变量&lt;/code>&lt;/div>&lt;div class="">&lt;code class="">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code>&lt;code class="">static&lt;/code> &lt;code class="">FinalExample obj;&lt;/code>&lt;/div>&lt;div class="">&amp;nbsp;&lt;/div>&lt;div class="">&lt;code class="">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code>&lt;code class="">public&lt;/code> &lt;code class="">FinalExample() {&lt;/code>&lt;/div>&lt;div class="">&lt;code class="">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code>&lt;code class="">i = &lt;/code>&lt;code class="">1&lt;/code>&lt;code class="">;&lt;/code>&lt;code class="">// 写普通域&lt;/code>&lt;/div>&lt;div class="">&lt;code class="">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code>&lt;code class="">j = &lt;/code>&lt;code class="">2&lt;/code>&lt;code class="">;&lt;/code>&lt;code class="">// 写 final 域&lt;/code>&lt;/div>&lt;div class="">&lt;code class="">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code>&lt;code class="">}&lt;/code>&lt;/div>&lt;div class="">&amp;nbsp;&lt;/div>&lt;div class="">&lt;code class="">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code>&lt;code class="">public&lt;/code> &lt;code class="">static&lt;/code> &lt;code class="">void&lt;/code> &lt;code class="">writer() {&lt;/code>&lt;code class="">// 写线程 A 执行&lt;/code>&lt;/div>&lt;div class="">&lt;code class="">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code>&lt;code class="">obj = &lt;/code>&lt;code class="">new&lt;/code> &lt;code class="">FinalExample();&lt;/code>&lt;/div>&lt;div class="">&lt;code class="">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code>&lt;code class="">}&lt;/code>&lt;/div>&lt;div class="">&amp;nbsp;&lt;/div>&lt;div class="">&lt;code class="">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code>&lt;code class="">public&lt;/code> &lt;code class="">static&lt;/code> &lt;code class="">void&lt;/code> &lt;code class="">reader() {&lt;/code>&lt;code class="">// 读线程 B 执行&lt;/code>&lt;/div>&lt;div class="">&lt;code class="">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code>&lt;code class="">FinalExample object = obj;&lt;/code>&lt;/div>&lt;div class="">&lt;code class="">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code>&lt;code class="">int&lt;/code> &lt;code class="">a = object.i;&lt;/code>&lt;/div>&lt;div class="">&lt;code class="">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code>&lt;code class="">int&lt;/code> &lt;code class="">b = object.j;&lt;/code>&lt;/div>&lt;div class="">&lt;code class="">&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code>&lt;code class="">}&lt;/code>&lt;/div>&lt;div class="">&lt;code class="">}&lt;/code>&lt;/div>&lt;/td>&lt;/tr>&lt;/tbody>&lt;/table>&lt;p>这里假设一个线程 A 执行 writer ()方法,随后另一个线程 B 执行 reader ()方法。&lt;/p></description></item></channel></rss>