﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-少年阿宾-随笔分类-volatile</title><link>http://www.blogjava.net/stevenjohn/category/54777.html</link><description>那些青春的岁月</description><language>zh-cn</language><lastBuildDate>Tue, 07 Apr 2015 12:00:41 GMT</lastBuildDate><pubDate>Tue, 07 Apr 2015 12:00:41 GMT</pubDate><ttl>60</ttl><item><title>volatile transient</title><link>http://www.blogjava.net/stevenjohn/archive/2015/01/18/422276.html</link><dc:creator>abin</dc:creator><author>abin</author><pubDate>Sun, 18 Jan 2015 13:08:00 GMT</pubDate><guid>http://www.blogjava.net/stevenjohn/archive/2015/01/18/422276.html</guid><wfw:comment>http://www.blogjava.net/stevenjohn/comments/422276.html</wfw:comment><comments>http://www.blogjava.net/stevenjohn/archive/2015/01/18/422276.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/stevenjohn/comments/commentRss/422276.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/stevenjohn/services/trackbacks/422276.html</trackback:ping><description><![CDATA[<font face="Calibri, sans-serif">1、volatile<br /></font><p class="MsoNormal" align="left" style="line-height: 17.45pt; background: #fafafa;"><span lang="EN-US" style="font-size:9.5pt;font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;mso-fareast-font-family:
宋体;color:#333333;mso-font-kerning:0pt">volatile</span><span style="font-size:
9.5pt;font-family:宋体;mso-ascii-font-family:Helvetica;mso-hansi-font-family:
Helvetica;mso-bidi-font-family:Helvetica;color:#333333;mso-font-kerning:0pt">字段的写入操作</span><span lang="EN-US" style="font-size:9.5pt;font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;
mso-fareast-font-family:宋体;color:#333333;mso-font-kerning:0pt">happens-before</span><span style="font-size:9.5pt;font-family:宋体;mso-ascii-font-family:Helvetica;
mso-hansi-font-family:Helvetica;mso-bidi-font-family:Helvetica;color:#333333;
mso-font-kerning:0pt">于每一个后续的同一个字段的读操作。</span><span lang="EN-US" style="font-size:9.5pt;font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;mso-fareast-font-family:
宋体;color:#333333;mso-font-kerning:0pt"><o:p></o:p></span></p>

<p class="MsoNormal" align="left" style="margin-bottom: 9.6pt; line-height: 13.15pt; background: #efefef;"><span style="font-size:9.5pt;font-family:宋体;mso-ascii-font-family:Helvetica;
mso-hansi-font-family:Helvetica;mso-bidi-font-family:Helvetica;color:#333333;
mso-font-kerning:0pt">因为实际上</span><span lang="EN-US" style="font-size:9.5pt;
font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;mso-fareast-font-family:宋体;color:#333333;
mso-font-kerning:0pt">put</span><span style="font-size:9.5pt;font-family:宋体;
mso-ascii-font-family:Helvetica;mso-hansi-font-family:Helvetica;mso-bidi-font-family:
Helvetica;color:#333333;mso-font-kerning:0pt">、</span><span lang="EN-US" style="font-size:9.5pt;font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;mso-fareast-font-family:
宋体;color:#333333;mso-font-kerning:0pt">remove</span><span style="font-size:
9.5pt;font-family:宋体;mso-ascii-font-family:Helvetica;mso-hansi-font-family:
Helvetica;mso-bidi-font-family:Helvetica;color:#333333;mso-font-kerning:0pt">等操作也会更新</span><span lang="EN-US" style="font-size:9.5pt;font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;
mso-fareast-font-family:宋体;color:#333333;mso-font-kerning:0pt">count</span><span style="font-size:9.5pt;font-family:宋体;mso-ascii-font-family:Helvetica;
mso-hansi-font-family:Helvetica;mso-bidi-font-family:Helvetica;color:#333333;
mso-font-kerning:0pt">的值，所以当竞争发生的时候，</span><span lang="EN-US" style="font-size:
9.5pt;font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;mso-fareast-font-family:宋体;
color:#333333;mso-font-kerning:0pt">volatile</span><span style="font-size:9.5pt;
font-family:宋体;mso-ascii-font-family:Helvetica;mso-hansi-font-family:Helvetica;
mso-bidi-font-family:Helvetica;color:#333333;mso-font-kerning:0pt">的语义可以保证写操作在读操作之前，也就保证了写操作对后续的读操作都是可见的，这样后面</span><span lang="EN-US" style="font-size:9.5pt;font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;
mso-fareast-font-family:宋体;color:#333333;mso-font-kerning:0pt">get</span><span style="font-size:9.5pt;font-family:宋体;mso-ascii-font-family:Helvetica;
mso-hansi-font-family:Helvetica;mso-bidi-font-family:Helvetica;color:#333333;
mso-font-kerning:0pt">的后续操作就可以拿到完整的元素内容。</span><span lang="EN-US" style="font-size:9.5pt;font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;mso-fareast-font-family:
宋体;color:#333333;mso-font-kerning:0pt"><o:p></o:p></span></p>

<p style="margin-top:6.9pt;margin-right:0cm;margin-bottom:6.9pt;margin-left:
0cm;line-height:12.0pt;background:white"><span style="font-size:10.5pt;
mso-ascii-font-family:Georgia;mso-hansi-font-family:Georgia;color:#002200">使用建议：在两个或者更多的线程访问的成员变量上使用</span><span lang="EN-US" style="font-size:10.5pt;font-family:&quot;Georgia&quot;,&quot;serif&quot;;color:#002200">volatile</span><span style="font-size:10.5pt;mso-ascii-font-family:Georgia;mso-hansi-font-family:
Georgia;color:#002200">。当要访问的变量已在</span><span lang="EN-US" style="font-size:10.5pt;
font-family:&quot;Georgia&quot;,&quot;serif&quot;;color:#002200">synchronized</span><span style="font-size:10.5pt;mso-ascii-font-family:Georgia;mso-hansi-font-family:
Georgia;color:#002200">代码块中，或者为常量时，不必使用。</span><span lang="EN-US" style="font-size:9.0pt;font-family:&quot;Helvetica&quot;,&quot;sans-serif&quot;;color:#333333"><o:p></o:p></span></p><font face="Calibri, sans-serif"><br /></font><div id="comment_body_2785719" class="blog_comment_body">volatile实际上只有在多cpu或者多核下才有用。当读取数据时，他不会cache缓存中读取，而是强制从内从中读取，这样读到的就是最新值。当写入数据的时候，会直接将数据写入内存中，并刷新所有其他核中的缓存，这样其他核看到的就是最新写入的值，也就是说，其他线程就看到了最新写入的值。</div><font face="Calibri, sans-serif"><br /></font><p>一般说来，volatile用在如下的几个地方：</p>
<p><font color="#0000ff">1、中断服务程序中修改的供其它程序检测的变量需要加volatile；</font></p>
<p><font color="#0000ff">2、多任务环境下各任务间共享的标志应该加volatile；</font></p>
<p><font color="#0000ff">3、存储器映射的硬件寄存器通常也要加volatile说明，因为每次对它的读写都可能由不同意义；</font></p>
<p><br />声明方式为　　volatile declaration</p>
<p><br />备注<br />系统总是在 volatile 
对象被请求的那一刻读取其当前值，即使上一条指令从同一对象请求值。而且，该对象的值在赋值时立即写入。</p>
<p>volatile 修饰符通常用于由多个线程访问而不使用 lock 语句来序列化访问的字段。使用 volatile 
修饰符能够确保一个线程检索由另一线程写入的最新值。<br /><br /></p><font face="Calibri, sans-serif"><br /></font><img src ="http://www.blogjava.net/stevenjohn/aggbug/422276.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/stevenjohn/" target="_blank">abin</a> 2015-01-18 21:08 <a href="http://www.blogjava.net/stevenjohn/archive/2015/01/18/422276.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>