﻿<?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-xan walking &amp; thinking-随笔分类-Java</title><link>http://www.blogjava.net/xan/category/30690.html</link><description>watch and learn</description><language>zh-cn</language><lastBuildDate>Wed, 07 May 2008 18:10:00 GMT</lastBuildDate><pubDate>Wed, 07 May 2008 18:10:00 GMT</pubDate><ttl>60</ttl><item><title>Tomcat 5.5 server.xml 配置的一些问题</title><link>http://www.blogjava.net/xan/archive/2008/05/07/198933.html</link><dc:creator>xan</dc:creator><author>xan</author><pubDate>Wed, 07 May 2008 05:02:00 GMT</pubDate><guid>http://www.blogjava.net/xan/archive/2008/05/07/198933.html</guid><wfw:comment>http://www.blogjava.net/xan/comments/198933.html</wfw:comment><comments>http://www.blogjava.net/xan/archive/2008/05/07/198933.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xan/comments/commentRss/198933.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xan/services/trackbacks/198933.html</trackback:ping><description><![CDATA[<ul>
    <li><strong>Host Name:</strong> </li>
</ul>
Network name of this virtual host, as registered in your
<em>Domain Name Service</em> server.  <br />
Exactly one of the Hosts
associated with each Engine MUST have a name matching the
<code>defaultHost</code> attribute of that Engine.<br />
<br />
<ul>
    <li><strong>Host Name Alias:</strong></li>
</ul>
in some circumstances, it is desireable that two or more
network names should resolve to the <strong>same</strong> virtual host.<br />
&lt;Host name="www.mycompany.com" ...&gt;<br />
&nbsp;&nbsp;&nbsp; ...<br />
&nbsp;&nbsp;&nbsp; &lt;Alias&gt;mycompany.com&lt;/Alias&gt;
<br />
&nbsp;&nbsp;&nbsp; ...<br />
&lt;/Host&gt;
<br />
In order for this strategy to be effective, all of the network names involved must be registered <br />
<ul>
    <li><strong>host appBase: </strong></li>
</ul>
The <em>Application Base</em> directory for this virtual host.
This is the pathname of a directory that may contain web applications
to be deployed on this virtual host.  <br />
You may specify an
absolute pathname for this directory, or a pathname that is relative
to the <code>$CATALINA_BASE</code> directory.<br />
<strong>appBase="webapps" </strong>is the default value.<br />
<br />
<ul>
    <li><strong>host context: </strong></li>
</ul>
<strong>
</strong>You can nest one or more <a href="http://tomcat.apache.org/tomcat-5.5-doc/config/context.html">Context</a> elements
inside this <strong>Host</strong> element, each representing a different web
application associated with this virtual host.<br />
<br />
<ul>
    <li><strong>context docBase:</strong></li>
</ul>
The <em>Document Base</em> (also known as the <em>Context
Root</em>) directory for this web application, or the pathname
to the web application archive file (if this web application is
being executed directly from the WAR file).    You may specify
an absolute pathname for this directory or WAR file, or a pathname
that is relative to the <code>appBase</code> directory of the
owning <a href="http://tomcat.apache.org/tomcat-5.5-doc/config/host.html">Host</a>.<br />
<em>If a symbolic link is used for docBase then changes to the
symbolic link will only be effective after a Tomcat restart or
by undeploying and redeploying the conext. A context reload is not
sufficient.<br />
</em><strong>Do not</strong> choose a docBase that starts with your Host's appBase string.
The default appBase is "webapps" so do not choose a docBase like
"webapps-foo."  Doing so will lead to deployment errors: see
<a href="http://issues.apache.org/bugzilla/show_bug.cgi?id=39013">Bugzilla</a> for details.<br />
The value of this field <strong>must not be set</strong> when the Context is
configured using a <code>META-INF/context.xml</code> file as it will be
inferred by the automatic deployment process.<br />
<br />
<ul>
    <li><strong>context path:</strong></li>
</ul>
The <em>context path</em> of this web application, which is
matched against the beginning of each request URI to select the
appropriate web application for processing.  <br />
All of the context paths
within a particular <a href="http://tomcat.apache.org/tomcat-5.5-doc/config/host.html">Host</a> <strong>must be unique</strong>.
If you specify a context path of an empty string (<strong><span style="color: red;">""</span></strong>), you are
defining the <em>default</em> web application for this Host, which
will process all requests not assigned to other Contexts.<br />
<strong><span style="color: #2708ff;"></span></strong><span style="font-family: Arial;"><span style="font-family: Verdana;"><span style="font-family: Courier;"><span style="font-family: Impact;"><span style="font-family: Arial;"><span style="font-size: 10pt;"><br />
<br />
<strong>问题</strong>： 为什么我可以使用http://www.mysite.com:8080/ 去访问Test Project,&nbsp; 而使用</span></span></span></span></span></span><span style="font-family: Arial;"><span style="font-family: Verdana;"><span style="font-family: Courier;"><span style="font-family: Impact;"><span style="font-family: Arial;"><span style="font-size: 10pt;">http://localhost:8080/</span></span></span></span></span></span> <span style="font-size: 10pt;">却不能，需使用http://localhost:8080/Test_Project访问<br />
<br />
C:\WINDOWS\system32\drivers\etc\hosts<br />
127.0.0.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; localhost<br />
127.0.0.1&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;www.mysite.com<br />
<br />
这个问题是&#8220;直接使用</span><a href="http://localhost/">http://localhost</a> 或 http://www.mysite.com/ <span style="font-size: 10pt;">访问开发的项目</span>&#8221; <span style="font-size: 10pt;">， 为了达到这一目的，有以下途径：<br />
<strong>途径1：</strong><br />
</span><span style="font-size: 10pt;"> &nbsp;&nbsp;&nbsp; 设置 context path=&#8220;&#8221; ，如<br />
</span><span style="font-size: 10pt;">&lt;Context docBase="Test Project" path="" reloadable="true" crossContext="true" source="org.eclipse.jst.j2ee.server:Test Project"/&gt;&lt;/Host&gt;<br />
<strong><span style="color: #0817ff;">但是这有一个问题</span></strong>：<br />
使用eclipse servers 新建一个server，产生配置文件 </span><span style="font-size: 10pt;">D:\WorkSpace\MY_DEV\Servers\Tomcat v5.5 Server @localhost-config\server.xml,</span><span style="font-size: 10pt;"> <strong>修改</strong>该自动生成的文件<br />
启动server后，这些配置文件将被发布到tomcat webapps的同级目录conf下，而且在发布时server.xml的内容为eclipse<strong>自动生成的内容</strong>，<strong>用户的修改被抛弃</strong>。所以为了达到</span><span style="font-size: 10pt;">&#8220;直接使用</span><a href="http://localhost/">http://localhost</a> 或 http://www.mysite.com/ <span style="font-size: 10pt;">访问开发的项目</span>&#8221; <span style="font-size: 10pt;">这一目标，有两种方法：</span><span style="font-size: 10pt;"><br />
方法一： <br />
&nbsp;&nbsp;&nbsp; 直接修改tomcat conf目录下的server.xml文件。<br />
<br />
方法二：<br />
&nbsp;&nbsp;&nbsp; 在eclipse中，在自动生成的server.xml基础上添加一个host<br />
&nbsp;&nbsp;&nbsp;<span style="font-size: 10pt;"><span style="font-size: 10pt;"> </span>&lt;Host appBase="webapps" autoDeploy="true" name="www.mysite.com" unpackWARs="true"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Context docBase="Test Project" path="" reloadable="true" source="org.eclipse.jst.j2ee.server:</span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">Test Project</span></span><span style="font-size: 10pt;"><span style="font-size: 10pt;">"/&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/Host&gt;<br />
该修改在"关闭，再启动"(<strong>直接重启不行</strong>)server后，能被更新到tomcat conf下面的server.xml<strong><br />
在项目发布中，最终生效的是tomcat conf下的server.xml<br />
</strong></span></span><span style="font-size: 10pt;"><br />
</span><span style="font-size: 10pt;">
<br />
<strong>途径2：来自</strong></span>http://blog.csdn.net/miqi770/archive/2008/02/20/2109805.aspx，<span style="font-size: 10pt;">未尝试</span><span style="font-size: 10pt;"></span>
<h1><a href="http://blog.csdn.net/miqi770/archive/2008/02/20/2109805.aspx"></a></h1>
<span style="font-size: 10pt;"><span style="font-size: 10pt;"><span style="font-size: 10pt;"><span style="font-size: 8pt;"><span style="font-size: 10pt;">使用</span>eclipse<span style="font-size: 10pt;">发布xm到tomcat</span><br />
&nbsp;<span style="font-size: 10pt;"><span style="font-size: 10pt;">把ROOT目录删掉,把xm重命名ROOT<br />
&nbsp;使用<a href="http://localhost/">http://localhost</a>时，可以直接访问自己开发的项目</span></span></span></span></span></span><br />
<span style="font-size: 10pt;"><br />
</span>
<img src ="http://www.blogjava.net/xan/aggbug/198933.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xan/" target="_blank">xan</a> 2008-05-07 13:02 <a href="http://www.blogjava.net/xan/archive/2008/05/07/198933.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA开发者应该去的20个英文网站【转转】</title><link>http://www.blogjava.net/xan/archive/2008/04/24/195498.html</link><dc:creator>xan</dc:creator><author>xan</author><pubDate>Thu, 24 Apr 2008 04:07:00 GMT</pubDate><guid>http://www.blogjava.net/xan/archive/2008/04/24/195498.html</guid><wfw:comment>http://www.blogjava.net/xan/comments/195498.html</wfw:comment><comments>http://www.blogjava.net/xan/archive/2008/04/24/195498.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xan/comments/commentRss/195498.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xan/services/trackbacks/195498.html</trackback:ping><description><![CDATA[http://www.javaalmanac.com - Java开发者年鉴一书的在线版本. 要想快速查到某种Java技巧的用法及示例代码, 这是一个不错的去处.<br />
http://www.onjava.com - O&#8216;Reilly的Java网站. 每周都有新文章.<br />
http://java.sun.com - 官方的Java开发者网站 - 每周都有新文章发表.<br />
http://www.developer.com/java - 由Gamelan.com 维护的Java技术文章网站.<br />
http://www.java.net - Sun公司维护的一个Java社区网站.<br />
http://www.builder.com - Cnet的Builder.com网站 - 所有的技术文章, 以Java为主.<br />
http://www.ibm.com/developerworks/java - IBM的Developerworks技术网站; 这是其中的Java技术主页.<br />
http://www.javaworld.com - 最早的一个Java站点. 每周更新Java技术文章.<br />
http://www.devx.com/java - DevX维护的一个Java技术文章网站.<br />
http://www.fawcette.com/javapro - JavaPro在线杂志网站.<br />
http://www.sys-con.com/java - Java Developers Journal的在线杂志网站.<br />
http://www.javadesktop.org - 位于Java.net的一个Java桌面技术社区网站.<br />
http://www.theserverside.com - 这是一个讨论所有Java服务器端技术的网站.<br />
http://www.jars.com - 提供Java评论服务. 包括各种framework和应用程序.<br />
http://www.jguru.com - 一个非常棒的采用Q&amp;A形式的Java技术资源社区.<br />
http://www.javaranch.com - 一个论坛,得到Java问题答案的地方,初学者的好去处.<br />
http://www.ibiblio.org/javafaq/javafaq.html - comp.lang.java的FAQ站点 - 收集了来自comp.lang.java新闻组的问题和答案的分类目录.<br />
http://java.sun.com/docs/books/tutorial/ - 来自SUN公司的官方Java指南 - 对于了解几乎所有的java技术特性非常有帮助.<br />
http://www.javablogs.com - 互联网上最活跃的一个Java Blog网站.<br />
http://java.about.com/ - 来自About.com的Java新闻和技术文章网站. <br />
<br />
<br />
原文： <br />
<h1><a id="viewpost1_TitleUrl" href="../../Xejuny/archive/2008/04/23/195125.html">JAVA开发者应该去的20个英文网站【转】</a></h1>
<img src ="http://www.blogjava.net/xan/aggbug/195498.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xan/" target="_blank">xan</a> 2008-04-24 12:07 <a href="http://www.blogjava.net/xan/archive/2008/04/24/195498.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java reflection</title><link>http://www.blogjava.net/xan/archive/2008/04/15/193209.html</link><dc:creator>xan</dc:creator><author>xan</author><pubDate>Tue, 15 Apr 2008 12:58:00 GMT</pubDate><guid>http://www.blogjava.net/xan/archive/2008/04/15/193209.html</guid><wfw:comment>http://www.blogjava.net/xan/comments/193209.html</wfw:comment><comments>http://www.blogjava.net/xan/archive/2008/04/15/193209.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xan/comments/commentRss/193209.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xan/services/trackbacks/193209.html</trackback:ping><description><![CDATA[<h2><a id="viewpost1_TitleUrl" class="singleposttitle" href="../../nbtymm/archive/2006/06/05/50439.html"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-family: Courier;">Java Reflection (JAVA反射)    ----转载</span></span></span></a></h2>
讲述reflect基本概念<br />
<br />
<img src ="http://www.blogjava.net/xan/aggbug/193209.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xan/" target="_blank">xan</a> 2008-04-15 20:58 <a href="http://www.blogjava.net/xan/archive/2008/04/15/193209.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>zz J2SE5中的注释</title><link>http://www.blogjava.net/xan/archive/2008/04/15/192959.html</link><dc:creator>xan</dc:creator><author>xan</author><pubDate>Mon, 14 Apr 2008 16:38:00 GMT</pubDate><guid>http://www.blogjava.net/xan/archive/2008/04/15/192959.html</guid><wfw:comment>http://www.blogjava.net/xan/comments/192959.html</wfw:comment><comments>http://www.blogjava.net/xan/archive/2008/04/15/192959.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xan/comments/commentRss/192959.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xan/services/trackbacks/192959.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 原文地址：http://www.java3z.com/cwbwebhome/article/article2/2769.html?id=1283                        一、什么是注释                         &nbsp;&nbsp;&nbsp; 说起注释，得先提一提什么是元数据(metadata)。所谓元数据就是数据的数据...&nbsp;&nbsp;<a href='http://www.blogjava.net/xan/archive/2008/04/15/192959.html'>阅读全文</a><img src ="http://www.blogjava.net/xan/aggbug/192959.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xan/" target="_blank">xan</a> 2008-04-15 00:38 <a href="http://www.blogjava.net/xan/archive/2008/04/15/192959.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>私有成员能被子类继承吗</title><link>http://www.blogjava.net/xan/archive/2008/04/15/192957.html</link><dc:creator>xan</dc:creator><author>xan</author><pubDate>Mon, 14 Apr 2008 16:28:00 GMT</pubDate><guid>http://www.blogjava.net/xan/archive/2008/04/15/192957.html</guid><wfw:comment>http://www.blogjava.net/xan/comments/192957.html</wfw:comment><comments>http://www.blogjava.net/xan/archive/2008/04/15/192957.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xan/comments/commentRss/192957.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xan/services/trackbacks/192957.html</trackback:ping><description><![CDATA[<font style="background-color: #c7edcc;"><a href="http://www.blogjava.net/sitinspring/archive/2007/12/04/165288.html">http://www.blogjava.net/sitinspring/archive/2007/12/04/165288.html</a> <br />
<span style="color: red;">父类的任何成员变量都是会被子类继承下去的 private,public,protected和继承没有关系,他们对成员函数和变量的限制只是在成员的可见性上</span><br />
<br />
<font style="background-color: #c7edcc;"><a href="http://www.blogjava.net/ChenGen/archive/2006/09/29/72773.html">http://www.blogjava.net/ChenGen/archive/2006/09/29/72773.html</a></font> <br />
此文中讨论了<a class="postTitle2" id="viewpost1_TitleUrl" href="http://www.blogjava.net/ChenGen/archive/2006/09/29/72773.html">JAVA类继承过程中其成员的一些问题</a>，其中包括<span style="color: red;">子类隐藏父类同名变量</span>的问题。<br />
<br />
<font style="background-color: #c7edcc;"><a href="http://www.blogjava.net/shisanfeng/articles/191375.html">http://www.blogjava.net/shisanfeng/articles/191375.html</a></font> <br />
此文中讨论了java继承中的一些基本概念，没有讨论到存储区域相关的问题<br />
</font><br />
<img src ="http://www.blogjava.net/xan/aggbug/192957.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xan/" target="_blank">xan</a> 2008-04-15 00:28 <a href="http://www.blogjava.net/xan/archive/2008/04/15/192957.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>while(i!=i){}</title><link>http://www.blogjava.net/xan/archive/2008/04/15/192951.html</link><dc:creator>xan</dc:creator><author>xan</author><pubDate>Mon, 14 Apr 2008 16:03:00 GMT</pubDate><guid>http://www.blogjava.net/xan/archive/2008/04/15/192951.html</guid><wfw:comment>http://www.blogjava.net/xan/comments/192951.html</wfw:comment><comments>http://www.blogjava.net/xan/archive/2008/04/15/192951.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xan/comments/commentRss/192951.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xan/services/trackbacks/192951.html</trackback:ping><description><![CDATA[<p>定义为：double i=Double.NaN 时 i!=i&nbsp;恒为true，死循环</p>
<img src ="http://www.blogjava.net/xan/aggbug/192951.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xan/" target="_blank">xan</a> 2008-04-15 00:03 <a href="http://www.blogjava.net/xan/archive/2008/04/15/192951.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>multi-thread: volatile(zz from javaEye)</title><link>http://www.blogjava.net/xan/archive/2008/04/10/191714.html</link><dc:creator>xan</dc:creator><author>xan</author><pubDate>Wed, 09 Apr 2008 16:26:00 GMT</pubDate><guid>http://www.blogjava.net/xan/archive/2008/04/10/191714.html</guid><wfw:comment>http://www.blogjava.net/xan/comments/191714.html</wfw:comment><comments>http://www.blogjava.net/xan/archive/2008/04/10/191714.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xan/comments/commentRss/191714.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xan/services/trackbacks/191714.html</trackback:ping><description><![CDATA[<div g_c_pdin="" g_p_center="" c07="" content="" style="width: 760px;" id="blogtext_fks!087068082083080075093084087095081087089064084095084071">
volatile, 用更低的代价替代同步<br />
<br />
为什么使用volatile比同步代价更低?<br />
同步的代价, 主要由其覆盖范围决定, 如果可以降低同步的覆盖范围, 则可以大幅提升程序性能.&nbsp;<br />
<br />
而volatile的覆盖范围仅仅变量级别的. 因此它的同步代价很低.<br />
<br />
volatile原理是什么?<br />
volatile的语义, 其实是告诉处理器, 不要将我放入工作内存, 请直接在主存操作我.(工作内存详见java内存模型)<br />
<br />
因此, 当多核或多线程在访问该变量时, 都将直接操作主存, 这从本质上, 做到了变量共享.<br />
<br />
volatile的有什么优势?<br />
1, 更大的程序吞吐量<br />
2, 更少的代码实现多线程<br />
3, 程序的伸缩性较好<br />
4, 比较好理解, 无需太高的学习成本<br />
<br />
volatile有什么劣势?<br />
1, 容易出问题<br />
2, 比较难设计<br />
<br />
<hr style="color: #ffffff;" />
<br />
volatile运算存在脏数据问题<br />
<br />
volatile仅仅能保证变量可见性, 无法保证原子性.<br style="color: #ffffff;" />
<br />
volatile的race condition示例:<br />
<br />
public class TestRaceCondition {<br />
&nbsp;&nbsp;&nbsp; private volatile int i = 0;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public void increase() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  i++;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public int getValue() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  return i;<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
当多线程执行increase方法时, 是否能保证它的值会是线性递增的呢?<br />
答案是否定的.<br />
<br />
原因:<br />
这里的increase方法, 执行的操作是i++, 即 i = i + 1;<br />
针对i = i + 1, 在多线程中的运算, 本身需要改变i的值.<br />
如果, 在i已从内存中取到最新值, 但未与1进行运算, 此时其他线程已数次将运算结果赋值给i.<br />
则当前线程结束时, 之前的数次运算结果都将被覆盖.<br />
<br />
即, 执行100次increase, 可能结果是 &lt; 100.<br />
一般来说, 这种情况需要较高的压力与并发情况下, 才会出现.<br />
<br />
如何避免这种情况?<br />
解决以上问题的方法:<br />
一种是 操作时, 加上同步.<br />
这种方法, 无疑将大大降低程序性能, 且违背了volatile的初衷.<br />
<br />
第二种方式是, 使用硬件原语(CAS), 实现非阻塞算法<br />
从CPU原语上,&nbsp; 支持变量级别的低开销同步.<br />
<br />
<hr style="color: #ffffff;" />
<br />
CPU原语-比较并交换(CompareAndSet),实现非阻塞算法<br />
<br />
什么是CAS?<br />
cas是现代CPU提供给并发程序使用的原语操作. 不同的CPU有不同的使用规范.<br />
<br />
在 Intel 处理器中，比较并交换通过指令的 cmpxchg 系列实现。<br style="color: #ffffff;" />
PowerPC 处理器有一对名为&#8220;加载并保留&#8221;和&#8220;条件存储&#8221;的指令，它们实现相同的目地；<br style="color: #ffffff;" />
MIPS 与 PowerPC 处理器相似，除了第一个指令称为&#8220;加载链接&#8221;。<br />
<br />
CAS 操作包含三个操作数 —— 内存位置（V）、预期原值（A）和新值(B)<br style="color: #ffffff;" />
<br style="color: #ffffff;" />
什么是非阻塞算法?<br />
一个线程的失败或挂起不应该影响其他线程的失败或挂起.这类算法称之为非阻塞(nonblocking)算法<br style="color: #ffffff;" />
<br style="color: #ffffff;" />
对比阻塞算法:<br style="color: #ffffff;" />
如果有一类并发操作, 其中一个线程优先得到对象监视器的锁, 当其他线程到达同步边界时, 就会被阻塞.<br style="color: #ffffff;" />
直到前一个线程释放掉锁后, 才可以继续竞争对象锁.(当然,这里的竞争也可是公平的, 按先来后到的次序)<br style="color: #ffffff;" />
<br style="color: #ffffff;" />
CAS 原理:<br />
<br />
我认为位置 V 应该包含值 A；如果包含该值，则将 B 放到这个位置；否则，不要更改该位置，只告诉我这个位置现在的值即可。<br style="color: #ffffff;" />
<br />
CAS使用示例(jdk 1.5 并发包 AtomicInteger类分析:)<br />
<br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Atomically sets to the given value and returns the old value.<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param newValue the new value<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return the previous value<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public final int getAndSet(int newValue) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (;;) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int current = get();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (compareAndSet(current, newValue))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return current;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public final boolean compareAndSet(int expect, int update) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return unsafe.compareAndSwapInt(this, valueOffset, expect, update);<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
这个方法是, AtomicInteger类的常用方法, 作用是, 将变量设置为指定值, 并返回设置前的值.<br />
它利用了cpu原语compareAndSet来保障值的唯一性.<br />
<br />
另, AtomicInteger类中, 其他的实用方法, 也是基于同样的实现方式.<br />
比如 getAndIncrement, getAndDecrement, getAndAdd等等.<br />
<br />
CAS语义上存在的"<a>ABA 问题"<br />
<br />
什么是ABA问题?<br />
</a><a style="color: #ffffff;">假设, 第一次读取V地址的A值, 然后通过CAS来判断V地址的值是否仍旧为A, 如果是, 就将B的值写入V地址,覆盖A值.<br />
<br />
但是, 语义上, 有一个漏洞, 当第一次读取V的A值, 此时, 内存V的值变为B值, 然后在未执行CAS前, 又变回了A值.<br />
此时, CAS再执行时, 会判断其正确的, 并进行赋值.<br />
<br />
这种判断值的方式来断定内存是否被修改过, 针对某些问题, 是不适用的. <br />
<br />
为了解决这种问题, jdk 1.5并发包提供了AtomicStampedReference(有标记的原子引用)类, 通过控制变量值的版本来保证CAS正确性.<br />
</a><a style="color: #ffffff;"><br />
其实, 大部分通过值的变化来CAS, 已经够用了.</a><a style="color: #ffffff;"><br />
<br />
</a><hr style="color: #ffffff;" />
<br style="color: #ffffff;" />
jdk1.5原子包介绍(基于volatile)<br />
<br />
包的特色:<br />
1, 普通原子数值类型AtomicInteger, AtomicLong提供一些原子操作的加减运算.<br />
<br />
2, 使用了解决脏数据问题的经典模式-"比对后设定", 即 查看主存中数据是否与预期提供的值一致,如果一致,才更新.<br />
<br />
3, 使用AtomicReference可以实现对所有对象的原子引用及赋值.包括Double与Float,<br />
但不包括对其的计算.浮点的计算,只能依靠同步关键字或Lock接口来实现了.<br />
<br />
4, 对数组元素里的对象,符合以上特点的, 也可采用原子操作.包里提供了一些数组原子操作类<br />
AtomicIntegerArray, AtomicLongArray等等.<br />
<br />
5, 大幅度提升系统吞吐量及性能.<br />
<br />
具体使用, 详解java doc.
</div>
<img src ="http://www.blogjava.net/xan/aggbug/191714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xan/" target="_blank">xan</a> 2008-04-10 00:26 <a href="http://www.blogjava.net/xan/archive/2008/04/10/191714.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[ant] ant初试</title><link>http://www.blogjava.net/xan/archive/2008/04/09/191703.html</link><dc:creator>xan</dc:creator><author>xan</author><pubDate>Wed, 09 Apr 2008 14:50:00 GMT</pubDate><guid>http://www.blogjava.net/xan/archive/2008/04/09/191703.html</guid><wfw:comment>http://www.blogjava.net/xan/comments/191703.html</wfw:comment><comments>http://www.blogjava.net/xan/archive/2008/04/09/191703.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xan/comments/commentRss/191703.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xan/services/trackbacks/191703.html</trackback:ping><description><![CDATA[<span style="font-family: Courier">部分参考网友内容,特此作谢!</span><br style="font-family: Courier" />
<br style="font-family: Courier" />
<span style="font-family: Courier">当一个代码项目大了以后，每次重新编译，打包，测试等都会变得非常复杂而且重复，因此c语言中有make脚本来帮助这些工作的批量完成。在Java 中应用是平台无关性的，当然不会用平台相关的make脚本来完成这些批处理任务了，ANT本身就是这样一个流程脚本引擎，用于自动化调用程序完成项目的编译，打包，测试等。除了基于JAVA是平台无关的外，脚本的格式是基于XML的，比make脚本来说还要好维护一些。</span><br style="font-family: Courier" />
<br style="font-family: Courier" />
<span style="color: rgb(0,0,255); font-family: Courier">a simple sample project with ant</span><br style="font-family: Courier" />
<br style="font-family: Courier" />
<a style="font-family: Courier" href="http://www.namipan.com/d/SpringWithJDBCandAnt.zip/4057bd9bf48dafa14efe13b73b26e09cd3f71a1ac0433100" target="_blank">http://www.namipan.com/d/SpringWithJDBCandAnt.zip/4057bd9bf48dafa14efe13b73b26e09cd3f71a1ac0433100</a>
 <img src ="http://www.blogjava.net/xan/aggbug/191703.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xan/" target="_blank">xan</a> 2008-04-09 22:50 <a href="http://www.blogjava.net/xan/archive/2008/04/09/191703.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>春天和冬眠</title><link>http://www.blogjava.net/xan/archive/2008/04/09/191702.html</link><dc:creator>xan</dc:creator><author>xan</author><pubDate>Wed, 09 Apr 2008 14:49:00 GMT</pubDate><guid>http://www.blogjava.net/xan/archive/2008/04/09/191702.html</guid><wfw:comment>http://www.blogjava.net/xan/comments/191702.html</wfw:comment><comments>http://www.blogjava.net/xan/archive/2008/04/09/191702.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xan/comments/commentRss/191702.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xan/services/trackbacks/191702.html</trackback:ping><description><![CDATA[prospring 里的例子,版权他有<br />
<a href="http://www.namipan.com/d/HibernateWithSpring.zip/00db8a5746523a4081dc333ad34dddb0d4e30710bb950000" target="_blank">http://www.namipan.com/d/HibernateWithSpring.zip/00db8a5746523a4081dc333ad34dddb0d4e30710bb950000</a><br />
<br />
可以直接run,也可以用build.xml, 只要改改读取的配置文件的路径即可, 如 "..\conf\applicationContext.xml" 之类的.<br />
<br />
applicationContext.xml 是关键, 在里面要配置几个重要的bean<br />
&nbsp;&nbsp;&nbsp; &lt;bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean"&gt;<br />
<br />
配置sessionFactory时,注意以下东西, 也就是要注意实际使用的hibernate的版本,我用的是spring1.1, 它里面lib\hibernate下有个hibernate2.jar,而且下面这个方法需要hibernate2 net.sf.hibernate支持 <span style="color: rgb(51,102,255); font-style: italic">org.springframework.orm.hibernate.support.HibernateDaoSupport.getHibernateTemplate()<br />
</span><span style="color: black">因而偶猜测spring1.1只支持hibernate2,故而方言选择就是下面的第一个了</span><span style="color: rgb(51,102,255); font-style: italic"><br />
</span>&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.dialect"&gt;net.sf.hibernate.dialect.MySQLDialect&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.dialect"&gt;org.hibernate.dialect.MySQLDialect&lt;/prop&gt;<br />
mysql不支持主键sequence,改成identity<br />
<br />
例外值得关注的是hibernate的mapping配置中的one-to-many. 其实还好了~<br />
<br />
数据库脚本和相关配置文件参见对应目录. 数据库建表手动搞定...<br />
<br />
注意要加入对应的spring对hibernate支持的包<br />
<img src ="http://www.blogjava.net/xan/aggbug/191702.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xan/" target="_blank">xan</a> 2008-04-09 22:49 <a href="http://www.blogjava.net/xan/archive/2008/04/09/191702.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>无意识无限递归</title><link>http://www.blogjava.net/xan/archive/2008/04/09/191700.html</link><dc:creator>xan</dc:creator><author>xan</author><pubDate>Wed, 09 Apr 2008 14:47:00 GMT</pubDate><guid>http://www.blogjava.net/xan/archive/2008/04/09/191700.html</guid><wfw:comment>http://www.blogjava.net/xan/comments/191700.html</wfw:comment><comments>http://www.blogjava.net/xan/archive/2008/04/09/191700.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xan/comments/commentRss/191700.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xan/services/trackbacks/191700.html</trackback:ping><description><![CDATA[public class InfiniteRecursion{<br />
&nbsp;&nbsp;&nbsp; public String toString(){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; return "InfiniteRecursion"+<span style="color: rgb(0,0,255)">this</span>+"\n";<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public static void main(String[] args){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; ArrayList al=new ArrayList();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; al.add(new InfiniteRecursion());<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; System.out.println(al);<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
问题在于String的自动类型转换，return "InfiniteRecursion"+<span style="color: rgb(0,0,255)">this</span>+"\n"&nbsp;&nbsp; 编译器见String后跟着一个&#8216;+&#8217;，&#8216;+&#8217;之后的不是String，于是编译器尝试将<span style="color: rgb(0,0,255)">this</span>转换为String，将调用InfiniteRecursion的toString()方法，从而造成递归。<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; zz <span style="font-style: italic">thinking in JAVA</span><br />
<img src ="http://www.blogjava.net/xan/aggbug/191700.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xan/" target="_blank">xan</a> 2008-04-09 22:47 <a href="http://www.blogjava.net/xan/archive/2008/04/09/191700.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Code Links</title><link>http://www.blogjava.net/xan/archive/2008/04/09/191694.html</link><dc:creator>xan</dc:creator><author>xan</author><pubDate>Wed, 09 Apr 2008 14:40:00 GMT</pubDate><guid>http://www.blogjava.net/xan/archive/2008/04/09/191694.html</guid><wfw:comment>http://www.blogjava.net/xan/comments/191694.html</wfw:comment><comments>http://www.blogjava.net/xan/archive/2008/04/09/191694.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xan/comments/commentRss/191694.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xan/services/trackbacks/191694.html</trackback:ping><description><![CDATA[<font style="font-family: Courier" size="5"><span style="font-weight: bold">spring+jdbc</span></font><br style="font-family: Courier" />
<span style="font-family: Courier">pro spring上的一个例子,原例比较乱,分块介绍,这里整合为 eclipse 下java project,&nbsp; 代码中有关键部分的注释:</span><br style="font-family: Courier" />
<a style="font-family: Courier" href="http://www.namipan.com/d/SpringWithJDBC.zip/af150784ec5c40cdfb26b82e2fc990c9676206cfe3540000" target="_blank">http://www.namipan.com/d/SpringWithJDBC.zip/af150784ec5c40cdfb26b82e2fc990c9676206cfe3540000</a><br style="font-family: Courier" />
<br style="font-family: Courier" />
<font style="font-family: Courier" size="5"><span style="font-weight: bold">File upload &amp; download</span></font><br style="font-family: Courier" />
<span style="font-family: Courier">源码也是别人的,出处忘了,sry.&nbsp;&nbsp; 原来是用myeclipse,我没有这个插件,不过相当没关系,只要重新建工程,再机械的^V就好了.&nbsp; </span><br style="font-family: Courier" />
<span style="font-family: Courier">代码的分析(待添加...)</span><br style="font-family: Courier" />
<br style="font-family: Courier" />
<span style="font-family: Courier">遇到的问题: web project 的包放错了(直接在configpath里添加了...晕菜...),导致出现服务器启动时无法找到ActionServlet错误(不过代码编译时是没有错误的) -----这个错误很低级,不过我虽然知道应该加到web-info的lib里,但是不是特别清楚configpath和lib的区别,或者说我猜到了, 却希望能从其他人那里得到印证.</span><br style="font-family: Courier" />
<a style="font-family: Courier" href="http://www.namipan.com/d/FileUploadDownload.zip/f60b9d9ad299a491d2794ca6e83739e2f9652c1f47b01500" target="_blank">http://www.namipan.com/d/FileUploadDownload.zip/f60b9d9ad299a491d2794ca6e83739e2f9652c1f47b01500</a><br style="font-family: Courier" />
<br style="font-family: Courier" />
<br style="font-family: Courier" />
<font style="font-family: Courier" size="5"><span style="font-weight: bold">验证码图片</span></font><br style="font-family: Courier" />
<span style="font-family: Courier">网上看到的,比较简单,随机生成背景(不复杂),随机生成数字,将数字嵌入背景</span><br style="font-family: Courier" />
<a style="font-family: Courier" href="http://www.namipan.com/d/ValidatePic.zip/63a3d84ef622464994779e761808728ce5f64e342d170000" target="_blank">http://www.namipan.com/d/ValidatePic.zip/63a3d84ef622464994779e761808728ce5f64e342d170000</a><br style="font-family: Courier" />
<br style="font-family: Courier" />
<span style="color: rgb(0,0,255); font-family: Courier">原代码中一个比较有价值的问题:</span><span style="font-family: Courier"> </span><br style="font-family: Courier" />
<font style="font-family: Courier" size="2">使用上述代码时会抛出一个异常：getOutputStream() has already been called for this response <br />
tomcat5下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法 <br />
<br />
在tomcat5下jsp中出现此错误一般都是在jsp中使用了输出流（如输出图片验证码，文件下载等）， <br />
没有妥善处理好的原因。 <br />
具体的原因就是 <br />
在tomcat中jsp编译成servlet之后在函数_jspService(HttpServletRequest request, HttpServletResponse response)的最后 <br />
有一段这样的代码 <br />
finally { <br />
if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context); <br />
} <br />
这里是在释放在jsp中使用的对象，会调用response.getWriter(),因为这个方法是和 <br />
response.getOutputStream()相冲突的！所以会出现以上这个异常。 <br />
<br />
然后当然是要提出解决的办法，其实挺简单的（并不是和某些朋友说的那样-- <br />
将jsp内的所有空格和回车符号所有都删除掉）， <br />
<br />
在使用完输出流以后调用以下两行代码即可： <br />
out.clear(); <br />
out = pageContext.pushBody(); </font>
<img src ="http://www.blogjava.net/xan/aggbug/191694.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xan/" target="_blank">xan</a> 2008-04-09 22:40 <a href="http://www.blogjava.net/xan/archive/2008/04/09/191694.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Java Parameter] Java中参数传递是传值还是传址 (收藏里不能添加摘要...)</title><link>http://www.blogjava.net/xan/archive/2008/04/09/191691.html</link><dc:creator>xan</dc:creator><author>xan</author><pubDate>Wed, 09 Apr 2008 14:34:00 GMT</pubDate><guid>http://www.blogjava.net/xan/archive/2008/04/09/191691.html</guid><wfw:comment>http://www.blogjava.net/xan/comments/191691.html</wfw:comment><comments>http://www.blogjava.net/xan/archive/2008/04/09/191691.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xan/comments/commentRss/191691.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xan/services/trackbacks/191691.html</trackback:ping><description><![CDATA[<font style="font-family: Courier" size="2">(...对于类的实例而言，这份拷贝恰巧是实例引用的拷贝，它（参数）指向的实例地址和原实例引用指向的地址都是一样的，因此对参数的修改有时也会影响到实例本身，故此造成了Java传递类是是传递的引用即地址的假象，如下面例子中的changeMemberField函数，但是我们把参数指向的地址改到别的实例上时，如changeMember函数，我们会发现参数和原实例引用再也不会发生关系了...)</font><br style="font-family: Courier" />
<a style="font-family: Courier" href="http://www.blogjava.net/sitinspring/archive/2008/01/16/175677.html" target="_blank">http://www.blogjava.net/sitinspring/archive/2008/01/16/175677.html</a>
  <img src ="http://www.blogjava.net/xan/aggbug/191691.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xan/" target="_blank">xan</a> 2008-04-09 22:34 <a href="http://www.blogjava.net/xan/archive/2008/04/09/191691.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Eclipse] Eclipse 颜色设置</title><link>http://www.blogjava.net/xan/archive/2008/04/09/191688.html</link><dc:creator>xan</dc:creator><author>xan</author><pubDate>Wed, 09 Apr 2008 14:25:00 GMT</pubDate><guid>http://www.blogjava.net/xan/archive/2008/04/09/191688.html</guid><wfw:comment>http://www.blogjava.net/xan/comments/191688.html</wfw:comment><comments>http://www.blogjava.net/xan/archive/2008/04/09/191688.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xan/comments/commentRss/191688.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xan/services/trackbacks/191688.html</trackback:ping><description><![CDATA[<span style="font-weight: bold; font-family: Courier">Eclipse颜色配置</span><br style="font-family: Courier" />
<a style="font-family: Courier" href="http://duanni.javaeye.com/blog/175517" target="_blank">http://duanni.javaeye.com/blog/175517</a><span style="font-family: Courier">&nbsp;</span>
<img src ="http://www.blogjava.net/xan/aggbug/191688.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xan/" target="_blank">xan</a> 2008-04-09 22:25 <a href="http://www.blogjava.net/xan/archive/2008/04/09/191688.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>