﻿<?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-xylz,imxylz-随笔分类-J2EE</title><link>http://www.blogjava.net/xylz/category/41095.html</link><description>关注后端架构、中间件、分布式和高性能RESTful服务</description><language>zh-cn</language><lastBuildDate>Tue, 15 Oct 2013 23:42:00 GMT</lastBuildDate><pubDate>Tue, 15 Oct 2013 23:42:00 GMT</pubDate><ttl>60</ttl><item><title>Java 8 入门/新特性</title><link>http://www.blogjava.net/xylz/archive/2013/10/16/405031.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Tue, 15 Oct 2013 16:33:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2013/10/16/405031.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/405031.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2013/10/16/405031.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/405031.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/405031.html</trackback:ping><description><![CDATA[<p>2013/09/05 已经发布了<a href="http://openjdk.java.net/projects/jdk8/" >JDK 8</a>的<a href="http://openjdk.java.net/projects/jdk8/milestones#Developer_Preview" >M8 Developer Preview</a>版本。 在<a href="http://openjdk.java.net/projects/jdk8/milestones#Feature_Complete" >M7(2013/06/13)</a><span class="Apple-converted-space">&nbsp;</span>所有新特性已经封版， M8 作为开发者预览版，基本上可用，可用<a href="http://jdk8.java.net/download.html" >Oracle网站下载</a>。 按照<a href="http://openjdk.java.net/projects/jdk8/milestones" >计划</a><a href="http://openjdk.java.net/projects/jdk8/milestones#General_Availability" >GA(General Availability)</a>版本 应该在2014年3月份发布，如果顺利正式版估计和GA版本相同，也就是说在明年3月份就正式使用JDK 8了。</p>
<p>这次JDK 8 一共带来了<a href="http://openjdk.java.net/projects/jdk8/features" >55个新特性</a>，目前所有API应该都已经冻结， 正在进行零bug测试。这次更新的力度比JDK 6/JDK 7都要大，延期了几次，也非常令人期待。 我个人准备花费几个月的学习时间，努力跟上Java 8的发布节奏。当然由于对Java 7不太熟悉，因此同时也学习下Java 7的API。</p>
<p>目前支持JDK 8的IDE有：</p>
<ul>
     <li><a href="https://netbeans.org/downloads/" >Netbeans 7.4</a></li>
     <li><a href="http://www.jetbrains.com/idea/download/" >IDEA 12</a></li>
     <li><a href="http://downloads.efxclipse.org/eclipse-java8/" >非官方的Eclipse</a>, 官方需要到明年Java 8正式发布以后</li>
</ul>
<p>并非所有JDK 8的特性IDE都能支持，因此需要随时更新IDE以便获得更好的开发环境，推荐使用IDEA。</p>
<br />
<h2>Java 8 新特性入门</h2>
<ol>
     <li>时间表</li>
     <li>Lambda</li>
     <li>流式操作 &#8211; Stream API</li>
     <li>接口默认方法 &#8211; Default Method</li>
     <li>日期和时间 &#8211; Date &amp; Time (JSR 310)</li>
     <li>集合扩展 &#8211; Collections API</li>
     <li>并发操作 &#8211; Concurrency API additions</li>
     <li>IO/NIO 扩展 &#8211; IO/NIO API additions</li>
     <li>反射和注解更新 &#8211; Reflection and annotation changes</li>
     <li>Base64</li>
     <li>其它各种更新 &#8211; Other additions</li>
</ol>
<hr />
<h2>Java 7 新特性入门</h2>
<ol>
     <li>字符串在switch中的使用</li>
     <li>try-with-resources 自动释放资源</li>
     <li>泛型实例创建的类型推断</li>
     <li>多异常catch操作</li>
     <li>文件API扩展</li>
     <li>集合API更新</li>
     <li>并发编程API更新</li>
     <li>Unicode 6.0的支持</li>
     <li>JDBC 4.1 支持 RowSet 1.1</li>
</ol>
<p>
[更新时间: 2013/10/16] <br/>
[原文地址：<a target="_blank" href="http://imxylz.com/java/">Java 8 入门/新特性</a>]
</p><img src ="http://www.blogjava.net/xylz/aggbug/405031.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2013-10-16 00:33 <a href="http://www.blogjava.net/xylz/archive/2013/10/16/405031.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>随机选择集合的子元素集合</title><link>http://www.blogjava.net/xylz/archive/2013/08/17/402978.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Sat, 17 Aug 2013 09:44:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2013/08/17/402978.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/402978.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2013/08/17/402978.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/402978.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/402978.html</trackback:ping><description><![CDATA[<div>我需要一个从集合N中随机选择M个子元素的算法。 当然最好的办法是将集合打乱顺序，然后从中选择前M个元素即可。 Java中现成的API可以使用：</div>
<div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->java.util.Collections.shuffle(List&lt;?&gt;)<br />
</div>
</div>
<div>
<div>此算法非常简单，循环N次，每次长度减少1，随机获取其中一个元素，然后交换其对称元素。</div>
</div>
<div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;shuffle(List&lt;?&gt;&nbsp;list,&nbsp;Random&nbsp;rnd)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;size&nbsp;=&nbsp;list.size();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(size&nbsp;&lt;&nbsp;SHUFFLE_THRESHOLD&nbsp;||&nbsp;list&nbsp;<span style="color: #0000FF; ">instanceof</span>&nbsp;RandomAccess)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i=size;&nbsp;i&gt;1;&nbsp;i--)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap(list,&nbsp;i-1,&nbsp;rnd.nextInt(i));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;arr[]&nbsp;=&nbsp;list.toArray();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Shuffle&nbsp;array</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i=size;&nbsp;i&gt;1;&nbsp;i--)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap(arr,&nbsp;i-1,&nbsp;rnd.nextInt(i));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Dump&nbsp;array&nbsp;back&nbsp;into&nbsp;list</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ListIterator&nbsp;it&nbsp;=&nbsp;list.listIterator();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i=0;&nbsp;i&lt;arr.length;&nbsp;i++)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it.set(arr[i]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</div>
</div>
<div><br />
</div>
<div>
<div>有点意思的swap函数</div>
</div>
<div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><br />
<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;swap(List&lt;?&gt;&nbsp;list,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;i,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;j)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;List&nbsp;l&nbsp;=&nbsp;list;<br />
&nbsp;&nbsp;&nbsp;&nbsp;l.set(i,&nbsp;l.set(j,&nbsp;l.get(i)));<br />
}<br />
</div>
</div>
<div><br />
</div>
<div>
<div>其实我们的需求很简单，在基本不变的集合中，多次重复随机获取其子集，至于子集是否有序或者随机不重要的， 重要的是原集合中的每个元素都有相似的概率出现在子集合中。</div>
<div><br />
</div>
<div>考虑到性能以及并发访问（多线程）的需要，我想到了一个简单的算法：</div>
</div>
<div>给定N个元素集合，从中选择M(0&lt;M&lt;=N)个元素的办法是，</div>
<div>
<ol>
     <li>随机选择索引K(0&lt;=K&lt;N), i=0, 空子集</li>
     <li>取有效元素N(k-i),N(k+i) 加入未满子集M</li>
     <li>i+=1, 重复(2) 直到子集M已满</li>
     <li>终止</li>
</ol>
</div>
<div>
<div>这样取出来的元素虽然和原始集顺序有一定的关系，但是每个元素在子集里出现的概率相当，满足结果要求。 最后生成的算法如下：</div>
</div>
<div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;&lt;T&gt;&nbsp;List&lt;T&gt;&nbsp;randomList(List&lt;T&gt;&nbsp;views,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;max)&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;size&nbsp;=&nbsp;views.size();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;index&nbsp;=&nbsp;RandomUtils.nextInt(size);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;List&lt;T&gt;&nbsp;ret&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ArrayList&lt;T&gt;(max);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;low&nbsp;=&nbsp;index&nbsp;-&nbsp;1,&nbsp;high&nbsp;=&nbsp;index;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(max&nbsp;&gt;&nbsp;0&nbsp;&amp;&amp;&nbsp;(low&nbsp;&gt;=&nbsp;0&nbsp;||&nbsp;high&nbsp;&lt;&nbsp;size))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(low&nbsp;&gt;=&nbsp;0&nbsp;&amp;&amp;&nbsp;max--&nbsp;&gt;&nbsp;0)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret.add(views.get(low));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(high&nbsp;&lt;&nbsp;size&nbsp;&amp;&amp;&nbsp;max--&nbsp;&gt;&nbsp;0)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret.add(views.get(high));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;low--;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;high++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;ret;<br />
}</div>
</div>
<div><br />
</div>
<div>此算法满足如下特点：</div>
<div>
<ol>
     <li>足够快</li>
     <li>线程安全（原始集合不变）</li>
     <li>子元素出现概率相当（未经数学证明</li>
</ol>
<div><br />
</div>
</div>
<div>另外，stackoverflow上也有一些参考链接：</div>
<div>
<ul>
     <li><a href="http://stackoverflow.com/questions/48087/select-a-random-n-elements-from-listt-in-c-sharp" target="_blank">
     </a></li>
     <li><a href="http://stackoverflow.com/questions/48087/select-a-random-n-elements-from-listt-in-c-sharp" target="_blank">Select a random N elements from List in C#</a></li>
     <a href="http://stackoverflow.com/questions/48087/select-a-random-n-elements-from-listt-in-c-sharp" target="_blank">
     </a>
     <li>http://mcherm.com/permalinks/1/a-random-selection-algorithm</li>
     <li>http://stackoverflow.com/questions/4702036/take-n-random-elements-from-a-liste</li>
</ul>
</div>
<br />
<div>[ 原文地址&nbsp;<a href="http://imxylz.com/blog/2013/08/14/select-a-random-sublist-from-list-in-java/">http://imxylz.com/blog/2013/08/14/select-a-random-sublist-from-list-in-java/</a>&nbsp;]</div><img src ="http://www.blogjava.net/xylz/aggbug/402978.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2013-08-17 17:44 <a href="http://www.blogjava.net/xylz/archive/2013/08/17/402978.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Crack JRebel 5.3.1</title><link>http://www.blogjava.net/xylz/archive/2012/12/26/393498.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Wed, 26 Dec 2012 04:02:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2012/12/26/393498.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/393498.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2012/12/26/393498.html#Feedback</comments><slash:comments>28</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/393498.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/393498.html</trackback:ping><description><![CDATA[JRebel 在热部署上真是神器，目前支持Windows 32/64、Linux 32/64、Mac OS X等操作系统，这可以从jrebel里面的jni动态链接库可以看出来。<br />
<br />
我一直使用5.1.0版本的jrebel，是social免费版本的。social版本会在启动时连接jrebel服务器（myrebel)获取license，同时会将一些热部署的次数、节约时间、性能等日志提交到远程服务器。<br />
最近中国网络抽风，连接jrebel服务器特别慢，导致每次启动的时候都需要10s以上的时间才能得到服务器的响应（加上自动更新检测）。最为一个技术控，很显然，我不能忍受这种行为。<br />
<br />
只好研究如何破解它。<br />
从4.0开始jrebel的混淆机制做得非常棒，基本上无法进行反编译修改了。好在jrebel比较厚道，一直兼容旧版本的license检测机制，翻出我2008年写的破解工程，顺利解决了5.1.0版本。<br />
然后下载最新的5.1.2（20121217）版本，尝试了下居然没有成功。太囧了。这是一个小版本，为何改动如此大？<br />
<br />
打开debug日志后发现，根本就没有加载jrebel.jar里面的License文件。反编译源码看了下，果然，从5.1.2版本开始不再加载jrebel.jar里面的license文件了，该从用户主目录，jrebel安装目录等获取license文件。这样就没法通过一个jar包分发jrebel了。<br />
将jrebel.lic拷贝到用户主目录的.jrebel目录即可。<br /><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><strong style="color: #0000ff;">~ $ ls ~/.jrebel/jrebel.lic&nbsp;</strong></div><div><strong style="color: #0000ff;">/Users/adyliu/.jrebel/jrebel.lic</strong></div></blockquote>
<strong>
<br />来两张截图。<br />
</strong>
<img src="http://www.blogjava.net/images/blogjava_net/xylz/jrebel-1.png" alt="jrebel 5.1.2 crack" style="font-size: xx-large;" height="480" width="780" /><br />
<img src="http://www.blogjava.net/images/blogjava_net/xylz/jrebel-2.png" alt="jrebel 5.1.2 crack" height="566" width="1086" align="middle" /><br />
<br />
<h2>下载地址</h2>
<ul>
     <li>4.0 http://www.blogjava.net/xylz/archive/2011/06/12/352109.html</li>
     <li>5.1.0&nbsp;<a href="/Files/xylz/jrebel.jar.zip">/Files/xylz/jrebel.jar.zip</a></li>
     <li>5.1.2&nbsp;<a href="/Files/xylz/jrebel-5.1.2.zip">/Files/xylz/jrebel-5.1.2.zip</a></li>
     <li>5.2.0&nbsp;<a title="jrebel-5.2.0-crack.zip" href="/Files/xylz/jrebel-5.2.0-crack.zip">jrebel-5.2.0-crack.zip</a></li>
     <li>5.2.2&nbsp;<a title="jrebel-5.2.2-crack.zip" href="/Files/xylz/jrebel-5.2.2-crack.zip">jrebel-5.2.2-crack.zip</a></li>
     <li>5.3.0&nbsp;<a title="jrebel-5.3.0-crack.zip" href="https://dl.dropboxusercontent.com/u/22951342/jrebel/jrebel-5.3.0-crack.zip">jrebel-5.3.0-crack.zip</a></li>
     <li>5.3.1 <a href="https://dl.dropboxusercontent.com/u/22951342/jrebel/jrebel-5.3.1-crack.zip">jrebel-5.3.1-crack.zip</a></li><li><a href="http://www.blogjava.net/xylz/archive/2013/09/15/404098.html">5.3.2 jrebel-5.3.2-crack.zip</a><br /></li>
</ul>
<hr />
<p><strong style="color: #ff0000;">Updated 2013/03/25<br />
</strong>
&nbsp; &nbsp; JRebel更新到5.2.0版本，所以可以放出一个低版本（我一直使用）5.1.2。5.1.3就暂时不去解决了。<br />
<img src="http://www.blogjava.net/images/blogjava_net/xylz/jrebel-5.2.0.png" alt="" height="456" width="859" /><br />
</p>
<hr />
<strong style="color: #ff0000;">Updated 2013/04/17<br />
</strong>&nbsp; &nbsp; JRebel 更新到5.2.2版本，所以可以放出一个低版本5.2.0。<br />
<img src="http://www.blogjava.net/images/blogjava_net/xylz/jrebel-5.2.2-crack.png" alt="" height="514" width="899" border="0" /><br />
<hr />
<strong style="color: #ff0000;">Updated 2013/06/06</strong><strong><br />
</strong>&nbsp; &nbsp; JRebel 更新到5.3.0版本，所以可以放出一个低版本5.2.2。<br />
<img src="http://www.blogjava.net/images/blogjava_net/xylz/QQ20130606-1.png" alt="" longdesc="JRebel 5.3.0 cracker" height="564" width="924" /><br />
<hr />
<strong style="color: #ff0000;">Updated 2013/07/12</strong><strong><br />
</strong>&nbsp; &nbsp; JRebel 更新到5.3.1版本，所以可以放出一个低版本5.3.0。<br /><img src="http://www.blogjava.net/images/blogjava_net/xylz/QQ20130716-2.png" alt="" height="421" width="867" border="0" /><br />
<hr /><strong><span style="color: red;">
</span><span style="color: red;">Updated 2013/09/15</span></strong><br />&nbsp;&nbsp;&nbsp; 最新版本的下载地址在：<a href="http://www.blogjava.net/xylz/archive/2013/09/15/404098.html">http://www.blogjava.net/xylz/archive/2013/09/15/404098.html</a><br /><br />PS:<br />
&nbsp; &nbsp; &nbsp;吐槽下，JRebel支持的功能越来越多，导致本身越来越大了，版本5.x已经快9M了！！！
<p>&nbsp;</p>
<p>
关键词： JRebel 5.3.1 crack, JRebel 5.3.0 crack, JRebel 5.2.2 crack, JRebel 5.2.0 crack, JRebel 5.1.2 crack,JRebel 5.1.0 crack, JRebel 5.x crack
</p><img src ="http://www.blogjava.net/xylz/aggbug/393498.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2012-12-26 12:02 <a href="http://www.blogjava.net/xylz/archive/2012/12/26/393498.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一次简单却致命的错误</title><link>http://www.blogjava.net/xylz/archive/2012/03/15/371966.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Thu, 15 Mar 2012 10:30:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2012/03/15/371966.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/371966.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2012/03/15/371966.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/371966.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/371966.html</trackback:ping><description><![CDATA[线上服务器负载过高发生了报警，同事找我求救。<br />我看到机器的负载都超过20了，查看java进程线程栈，找到了出问题的代码。<br />
<br />
下面是其代码片段，实际情况错误处理比这更坏。<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span>&nbsp;demo;<br />
<span style="color: #008080; ">&nbsp;2</span>&nbsp;<br />
<span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;java.io.BufferedReader;<br />
<span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;java.io.InputStream;<br />
<span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;java.io.InputStreamReader;<br />
<span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;java.net.HttpURLConnection;<br />
<span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;java.net.URL;<br />
<span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;java.net.URLConnection;<br />
<span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #0000FF; ">import</span>&nbsp;org.apache.commons.lang.StringUtils;<br />
<span style="color: #008080; ">10</span>&nbsp;<br />
<span style="color: #008080; ">11</span>&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;adyliu&nbsp;(imxylz#gmail.com)<br />
</span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;</span><span style="color: #808080; ">@since</span><span style="color: #008000; ">&nbsp;2012-3-15<br />
</span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><br />
<span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;FaultDemo&nbsp;{<br />
<span style="color: #008080; ">16</span>&nbsp;<br />
<span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;args<br />
</span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />
<span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />
<span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;String&nbsp;tudou&nbsp;=&nbsp;"http://v.youku.com/v_playlist/f17170661o1p9.html";<br />
<span style="color: #008080; ">22</span>&nbsp;<br />
<span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URL&nbsp;url&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;URL(tudou);<br />
<span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpURLConnection&nbsp;conn&nbsp;=&nbsp;(HttpURLConnection)&nbsp;url.openConnection();<br />
<span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.connect();<br />
<span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />
<span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;in&nbsp;=&nbsp;conn.getInputStream();<br />
<span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;br&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BufferedReader(<span style="color: #0000FF; ">new</span>&nbsp;InputStreamReader(in,&nbsp;"utf-8"));<br />
<span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;buf&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StringBuilder();<br />
<span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;line&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />
<span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;((line&nbsp;=&nbsp;br.readLine())&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />
<span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(StringUtils.isNotEmpty(buf.toString()))&nbsp;{<br />
<span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf.append("\r\n");<br />
<span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf.append(line);<br />
<span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">do&nbsp;something&nbsp;with&nbsp;'buf'</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #008000; "></span><br />
<span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">finally</span>&nbsp;{<br />
<span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.disconnect();<br />
<span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">42</span>&nbsp;<br />
<span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">44</span>&nbsp;<br />
<span style="color: #008080; ">45</span>&nbsp;}<br />
<span style="color: #008080; ">46</span>&nbsp;</div>
<br />
思考下，这段代码有什么<strong style="background-color: yellow; ">致命</strong>问题么？（这里不追究业务逻辑处理的正确性以及细小的瑕疵）<br />
.<br />
..<br />
...<br />
现在回来。<br />
我发现线程栈里面的线程都RUNNABLE在32行。<br />
这一行看起来有什么问题呢？StringBuilder.toString()不是转换成String么？Apache commons-lang里面的StringUtils.isNotEmpty使用也没问题啊？<br />
看代码，人家的逻辑其实是判断是否是第一行，如果不是第一行那么就增加一个换行符。<br />
<br />
既然CPU在这里运行，那么就说明这个地方一定存在非常耗费CPU的操作，导致CPU非常繁忙，从而系统负载过高。<br />
看详细堆栈，其实CPU在进行内存的拷贝动作。<br />
看下面的源码。<br />
<em style="color: #0000ff; ">java.lang.StringBuilder.toString()</em><br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;toString()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Create&nbsp;a&nbsp;copy,&nbsp;don't&nbsp;share&nbsp;the&nbsp;array</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;String(value,&nbsp;0,&nbsp;count);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</div>
接着看java.lang.String的构造函数：<br />
<div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String(<span style="color: #0000FF; ">char</span>&nbsp;value[],&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;offset,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;count)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(offset&nbsp;&lt;&nbsp;0)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StringIndexOutOfBoundsException(offset);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(count&nbsp;&lt;&nbsp;0)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StringIndexOutOfBoundsException(count);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Note:&nbsp;offset&nbsp;or&nbsp;count&nbsp;might&nbsp;be&nbsp;near&nbsp;-1&gt;&gt;&gt;1.</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(offset&nbsp;&gt;&nbsp;value.length&nbsp;-&nbsp;count)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StringIndexOutOfBoundsException(offset&nbsp;+&nbsp;count);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.offset&nbsp;=&nbsp;0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.count&nbsp;=&nbsp;count;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.value&nbsp;=&nbsp;Arrays.copyOfRange(value,&nbsp;offset,&nbsp;offset+count);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</div>
<br />
看出来了么？<br />
问题的关键在于String构造函数的最后一行，value并不是直接指向的，而是重新生成了一个新的字符串，使用系统拷贝函数进行内存复制。<br />
<div><em style="color: #0000ff; ">java.util.Arrays.copyOfRange(char[], int, int)</em></div>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">char</span>[]&nbsp;copyOfRange(<span style="color: #0000FF; ">char</span>[]&nbsp;original,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;from,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;to)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;newLength&nbsp;=&nbsp;to&nbsp;-&nbsp;from;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(newLength&nbsp;&lt;&nbsp;0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;IllegalArgumentException(from&nbsp;+&nbsp;"&nbsp;&gt;&nbsp;"&nbsp;+&nbsp;to);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>[]&nbsp;copy&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">char</span>[newLength];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.arraycopy(original,&nbsp;from,&nbsp;copy,&nbsp;0,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Math.min(original.length&nbsp;-&nbsp;from,&nbsp;newLength));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;copy;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</div>
<br />
好了，再回头看逻辑代码32行。<br />
<div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">if</span>&nbsp;(StringUtils.isNotEmpty(buf.toString()))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;buf.append("\r\n");<br />
}</div>
这里有问题的地方在于每次循环一行的时候都生成一个新的字符串。也就是说如果HTTP返回的结果输入流中有1000行的话，将额外生成1000个字符串（不算StringBuilder扩容生成的个数）。每一个字符串还比前一个字符串大。<br />
<br />
<br />
我们来做一个简单的测试，我们在原来的代码上增加几行计数代码。<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;lines&nbsp;=0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;count&nbsp;=&nbsp;0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;malloc&nbsp;=&nbsp;0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;((line&nbsp;=&nbsp;br.readLine())&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lines++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count+=line.length();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;malloc&nbsp;+=&nbsp;count;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(StringUtils.isNotEmpty(buf.toString()))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf.append("\r\n");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf.append(line);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(lines+"&nbsp;-&gt;&nbsp;"+count+"&nbsp;-&gt;&nbsp;"+malloc);</div>
我们记录下行数lines以及额外发生的字符串拷贝大小malloc。<br />
这是一次输出的结果。<br />
<div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->1169&nbsp;-&gt;&nbsp;66958&nbsp;-&gt;&nbsp;39356387</div>
也就是1169行的网页，一共是66958字节（65KB），结果额外生成的内存大小（不算StringBuilder扩容占用的内存大小）为39356387字节（37.5MB)!!!<br />
试想一下，CPU一直频繁于进行内存分配，机器的负载能不高么？我们线上服务器是2个CPU 16核，内存24G的Redhat Enterprise Linux 5.5，负载居然达到几十。这还是只有访问量很低的时候。这就难怪服务频繁宕机了。<br />
<br />
事实上我们有非常完善和丰富的基于Apache commons-httpclient的封装，操作起来也非常简单。对于这种简单的请求，只需要一条命令就解决了。<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->String&nbsp;platform.utils.HttpClientUtils.getResponse(String)<br />
String&nbsp;platform.utils.HttpClientUtils.postResponse(String,&nbsp;Map&lt;String,&nbsp;String&gt;)</div>
<br />
即使非要自造轮子，处理这种简单的输入流可以使用下面的代码，就可以很好的解决问题。<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->&nbsp; &nbsp; InputStream&nbsp;in&nbsp;=&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;ByteArrayOutputStream&nbsp;baos&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ByteArrayOutputStream(8192);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;len&nbsp;=&nbsp;-1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;b&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">byte</span>[8192];<span style="color: #008000; ">//</span><span style="color: #008000; ">8k</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;((len&nbsp;=&nbsp;in.read(b))&nbsp;&gt;&nbsp;0)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;baos.write(b,&nbsp;0,&nbsp;len);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;baos.close();<span style="color: #008000; ">//</span><span style="color: #008000; ">ignore&nbsp;is&nbsp;ok</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;response&nbsp;=&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;String(baos.toByteArray(),&nbsp;encoding);</div>
<br />
当然了，最后紧急处理线上问题最快的方式就是将有问题的代码稍微变通下即可。<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(<strong style="background-color: yellow; ">buf.length()&nbsp;&gt;&nbsp;0</strong>)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf.append("\r\n");<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</div>
<br />
<br />
这个问题非常简单，只是想表达几个观点：<br />
<ul>
     <li>团队更需要合作，按照规范来进行。自造轮子不是不可以，但是生产环境还是要限于自己熟悉的方式。</li>
     <li>即使非常简单的代码，也有可能有致命的陷阱在里面。善于思考才是王道。</li>
     <li>学习开源的代码和常规思路，学习解决问题的常规做法。这个问题其实非常简单，熟悉输入输出流的人非常熟练就能解决问题。</li>
</ul><img src ="http://www.blogjava.net/xylz/aggbug/371966.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2012-03-15 18:30 <a href="http://www.blogjava.net/xylz/archive/2012/03/15/371966.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Framework 3.1 Reference CHM</title><link>http://www.blogjava.net/xylz/archive/2012/02/08/369608.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Wed, 08 Feb 2012 08:41:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2012/02/08/369608.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/369608.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2012/02/08/369608.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/369608.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/369608.html</trackback:ping><description><![CDATA[自己制作的CHM文件，基于SpringFramework最新版本3.1.0.RELEASE。不喜欢的可以使用原版的HTML或者PDF版本。其实PDF版本排版就挺好的。<br />
<br />
去掉了发生错误的javascript（网络原因，你懂的），索引排序重命名，稍微排版了下。<br />
<br />
没有改动任何内容。<strong style="font-family: 'Comic Sans MS'; font-size: 14pt; color: #0000ff; ">毫无疑问，这是英文版的，因为没有人翻译。</strong><br />
<br />
截图如下。<br />
<img src="http://www.blogjava.net/images/blogjava_net/xylz/springframework3.1reference.png" width="966" height="670" alt="" /><br />
<br />
<a title="Spring Framework 3.1 Reference CHM" href="/Files/xylz/SpringFramework3.1-Reference_en.zip">Spring Framework 3.1 Reference CHM</a>
<br />
<a title="Spring Framework 3.1 Reference CHM" href="http://www.imxylz.info/wiki/wiki/upload/Java/SpringFramework3.1-Reference_en.chm">SpringFramework3.1-Reference_en.chm</a><img src ="http://www.blogjava.net/xylz/aggbug/369608.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2012-02-08 16:41 <a href="http://www.blogjava.net/xylz/archive/2012/02/08/369608.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编程语言大战</title><link>http://www.blogjava.net/xylz/archive/2011/12/06/365658.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Tue, 06 Dec 2011 03:25:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2011/12/06/365658.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/365658.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2011/12/06/365658.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/365658.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/365658.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 刚看到这个月的编程语言排行榜，很显然java的霸主地位很快就会在发达国家被挤掉，C语言依然是王者（想想上个月自己买的两个C语言的书，冷汗直流）。看来我迟早要回归C，这才是真正的王道。<br><br><br><br>非常令人吃惊的是C++语言依然不够坚挺，由于Windows 7/Windows 8的发力，C#很快就会抢占C++的市场，估计很快就会将C++从前三名中挤下去。<br><br><br><br>iPhone/iPad的热销让Object C继续火热，前十的位置还是可以持续很久的，这一点毋庸置疑。移动设备开发的高端人才现在是高薪难求，如果有时间我也要继续关注下。&nbsp;&nbsp;<a href='http://www.blogjava.net/xylz/archive/2011/12/06/365658.html'>阅读全文</a><img src ="http://www.blogjava.net/xylz/aggbug/365658.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2011-12-06 11:25 <a href="http://www.blogjava.net/xylz/archive/2011/12/06/365658.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>处理Zookeeper的session过期问题</title><link>http://www.blogjava.net/xylz/archive/2011/12/05/365578.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Mon, 05 Dec 2011 05:57:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2011/12/05/365578.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/365578.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2011/12/05/365578.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/365578.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/365578.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Zookeeper客户端和服务端维持一个长连接，每隔10s向服务端发送一个心跳，服务端返回客户端一个响应。这就是一个Session连接，拥有全局唯一的session id。Session连接通常是一直有效，如果因为网络原因断开了连接，客户端会使用相同的session id进行重连。由于服务端保留了session的各种状态，尤其是各种瞬时节点是否删除依赖于session是否失效。<br>Session失效问题<br><br>通常客户端主动关闭连接认为是一次session失效。另外也有可能因为其它未知原因，例如网络超时导致的session失效问题。在服务端看来，无法区分session失效是何种情况，一次一旦发生session失效，一定时间后就会将session持有的所有watcher以及瞬时节点删除。<br>而对于Zookeeper客户端而言，一旦发生失效不知道是否该重连，这涉及到watcher和瞬时节点问题，因此Zookeeper客户端认为，一旦发生了seesion失效，那么就认为客户端死掉了。从而所有操作都不能够进行。参考 How should I handle SESSION&nbsp;&nbsp;<a href='http://www.blogjava.net/xylz/archive/2011/12/05/365578.html'>阅读全文</a><img src ="http://www.blogjava.net/xylz/aggbug/365578.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2011-12-05 13:57 <a href="http://www.blogjava.net/xylz/archive/2011/12/05/365578.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>享受热部署的好处</title><link>http://www.blogjava.net/xylz/archive/2011/06/17/352476.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Fri, 17 Jun 2011 01:25:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2011/06/17/352476.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/352476.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2011/06/17/352476.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/352476.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/352476.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="font-family: verdana; font-size: 12px; line-height: normal; background-color: #ffffff; "><p style="margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size: 14pt; "><strong>你还在为频繁部署服务器而烦恼么？<br /></strong></span><br />亲，试试jrebel吧。更多jrebel的介绍参考这里<a href="http://www.zeroturnaround.com/jrebel/" target="_blank" style="color: #4d87c1; text-decoration: none; font-family: arial; font-weight: bold; font-size: 1.1em; ">http://www.zeroturnaround.com/jrebel/</a>。</p><p style="margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">啊？免费版只能使用30天？花钱？十个人的团队使用一年的企业版License是<span style="font-family: 'Comic Sans MS'; font-size: 18pt; "><strong>2891$</strong></span>！你没看错，是真真正正的美帝国的钱！</p><p style="margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">好吧，我等穷人使用不起，只好&#8220;自己动手/丰衣足食&#8221;。</p><p style="margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">这里提供了一个完整功能的企业版，免费大甩送了，有木有!!!</p><p style="margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></p><div><a href="http://www.blogjava.net/xylz/archive/2011/06/12/352109.html">http://www.blogjava.net/xylz/archive/2011/06/12/352109.html</a></div><p>&nbsp;</p><p style="margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">怎么使用，最简单方式,在resin的启动文件，例如httpd.sh中增加：</p><p style="margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Resin 3.1+版本：</p><blockquote style="background-image: initial; background-color: #fafafa; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: #e5e5e5; border-right-color: #e5e5e5; border-bottom-color: #e5e5e5; border-left-color: #e5e5e5; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 1px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; font-size: 10px; "><p style="margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-align: left; ">exec $JAVA_EXE&nbsp;<span style="color: #ff0000; "><strong>-javaagent:/opt/apps/resin/jrebel4.0-crack.jar</strong></span>&nbsp;-jar ${RESIN_HOME}/lib/resin.jar $*</p></blockquote><p style="margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Resin 3.0-版本：</p><blockquote style="background-image: initial; background-color: #fafafa; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: #e5e5e5; border-right-color: #e5e5e5; border-bottom-color: #e5e5e5; border-left-color: #e5e5e5; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 1px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; font-size: 10px; "><p style="margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-align: left; ">args=&#8221;<span style="color: #ff0000; "><strong>-J-javaagent:/opt/apps/resin/jrebel4.0-crack.jar</strong></span>&#8220;</p></blockquote><p style="margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="font-size: 14pt; ">Tomcat？Jetty? Jboss? WebLogic? WebSphere? Maven? Eclipse? And More?</span></p><p style="margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">OK，参考这里文档吧：<a href="http://www.zeroturnaround.com/reference-manual/" target="_blank" style="color: #4d87c1; text-decoration: none; font-family: arial; font-weight: bold; font-size: 1.1em; ">http://www.zeroturnaround.com/reference-manual/</a></p><p style="margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">亲，不要钱的，试试吧！</p><p style="margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">有木有更简单，更NB的热部署秘籍啊？</p><p style="margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">有的，亲！</p><p style="margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">如果你的Linux x86 (x86_64位目前没有)的glibc是2.4+版本，试试<a href="http://ssw.jku.at/dcevm/" target="_blank" style="color: #4d87c1; text-decoration: none; font-family: arial; font-weight: bold; font-size: 1.1em; ">dcevm</a>吧！Windows 32/64位同样有相应的版本啊！</p></span><img src ="http://www.blogjava.net/xylz/aggbug/352476.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2011-06-17 09:25 <a href="http://www.blogjava.net/xylz/archive/2011/06/17/352476.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Crack JRebel 4.0，无需重启JVM，热部署解决方案</title><link>http://www.blogjava.net/xylz/archive/2011/06/12/352109.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Sat, 11 Jun 2011 16:24:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2011/06/12/352109.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/352109.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2011/06/12/352109.html#Feedback</comments><slash:comments>35</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/352109.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/352109.html</trackback:ping><description><![CDATA[<span style="color: #0e774a; font-family: arial, sans-serif; line-height: 15px; font-size: small; "><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; "><a href="http://dl.dropbox.com/u/22951342/jrebel.jar" target="_new" style="color: navy; text-decoration: none; ">http://dl.dropbox.com/u/22951342/jrebel.jar</a>&nbsp;&nbsp;</span>www.zeroturnaround.com</span>最近又接触到一点WEB应用，想到Resin服务器重启需要花费比较多的时间（Spring将WEB服务搞得越来越复杂，越来越臃肿了），所以又想到了08年那时候用JavaRebel了。一段时间不用人家居然改名为JavaRebel了。<br />如果不熟悉的可以搜索下JRebel/JavaRebel，这里是官方网站：<div style="display: inline-block; "></div><span class="Apple-style-span" style="color: #0e774a; font-family: arial, sans-serif; line-height: 15px; background-color: #ffffff; font-size: small; ">www.zeroturnaround.com。<br /></span>最近刚发布了4.0版本，功能更强大，配置也更加简单了。价格不菲。<br />官方提供30天试用版，可以先体验下再决定是否购买。<br /><br />看到里面的代码混淆让我很崩溃，没有深入研究混淆后的运行机制。比如下面居然有两个名称相同，参数相同，但是返回值不同的静态方法，不知是如何执行的。<br />public static void a(String s)和 public static String a(String)，以及<br />private static void c()和private static String c()。<br />猜测是在运行的时候自己进行JVM指令的执行。这样的代码反编译后都不知道怎么写回去，想到崩溃，因为两个方法居然都有地方调用了。<br /><br /><img src="http://www.blogjava.net/images/blogjava_net/xylz/jrebel-method.png" border="0" alt="" width="206" height="361" /><br /><br /><div><a href="http://my.oschina.net/zhangthe9" target="_blank">zhangthe9&nbsp;</a>提供了一个4.0的破解版，我很好奇，咨询了下，居然还是以前的RSA签名算法。</div><br />好吧，翻出08年写的JavaRebel 2.0-M1的破解程序，重新生成一个license文件，修改公钥，替换license文件，居然运行正常。这么多年了，签名算法和步骤居然一点都没变，嗯，人家真执着！<br />当然是无限制版，所有功能可用，也没有时间限制。<br /><br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#############################################################<br /><br />&nbsp;JRebel&nbsp;</span><span style="color: #000000; ">4.0</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">201105311152</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;with&nbsp;Enterprise&nbsp;Add</span><span style="color: #000000; ">-</span><span style="color: #000000; ">On</span><span style="color: #000000; ">!</span><span style="color: #000000; ">&nbsp;(see&nbsp;http:</span><span style="color: #008000; ">//</span><span style="color: #008000; ">jrebel.com/enterprise)</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;(c)&nbsp;Copyright&nbsp;ZeroTurnaround&nbsp;OU,&nbsp;Estonia,&nbsp;Tartu.<br /><br />&nbsp;Over&nbsp;the&nbsp;last&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;days&nbsp;JRebel&nbsp;prevented&nbsp;<br />&nbsp;at&nbsp;least&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;redeploys</span><span style="color: #000000; ">/</span><span style="color: #000000; ">restarts&nbsp;saving&nbsp;you&nbsp;about&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;hours.<br /><br />&nbsp;This&nbsp;product&nbsp;is&nbsp;licensed&nbsp;to&nbsp;www.imxylz.info<br />&nbsp;</span><span style="color: #0000ff; background-color: yellow; ">for</span><span style="color: #000000; background-color: yellow; ">&nbsp;unlimited&nbsp;number&nbsp;of&nbsp;developer&nbsp;seats&nbsp;on&nbsp;site.</span><span style="color: #000000; "><br />&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;Cracked&nbsp;by&nbsp;imxylz&nbsp;(imxylz#gmail.com)&nbsp;from&nbsp;JavaRebel&nbsp;</span><span style="color: #000000; ">2.0</span><span style="color: #000000; ">-</span><span style="color: #000000; ">M1,&nbsp;</span><span style="color: #000000; ">2008</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; "><br /><br />#############################################################<br /><br />伟大领袖毛主席，指引我们向前进！<br />jrebel&nbsp;cracked&nbsp;by&nbsp;imxylz<br />伟大领袖毛主席，指引我们向前进！<br />jrebel&nbsp;cracked&nbsp;by&nbsp;imxylz<br /></span><span style="color: #000000; background-color: yellow; ">JRebel:&nbsp;Reloading&nbsp;</span><span style="color: #0000ff; background-color: yellow; ">class</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; background-color: yellow; ">'</span><span style="color: #000000; background-color: yellow; ">ReloadClass</span><span style="color: #000000; background-color: yellow; ">'</span><span style="color: #000000; background-color: yellow; ">.change&nbsp;</span><span style="color: #000000; "><br />伟大领袖毛主席，指引我们向前进！<br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">!</span><span style="color: #000000; "><br /></span></div><br />破解思路很简单，替换公钥，使用自己私钥生成签名License文件。<br />如果想屏蔽版本更新提示，有以下几种思路：<br />（1）修改调用更新坚持的类（难道有点大，因为混淆比较严重，不容易反编译）<br />（2）修改更新服务器的地址，将<a href="http://update.zeroturnaround.com/jrebel/">http://update.zeroturnaround.com/jrebel/</a>地址修改，可以使用二进制工具直接修改字符串，比如我就将update改为updatt，无法解析域名就不能获取最新版本了。<br />（3）增加-Drebel.disable_update=true参数即可。（这种方法最简单）。<br /><br /><div style="text-align: left;"><strike>当然了，为了&#8220;保护知识产权&#8221;，不会将破解文件放出来，有需求的可以留言联系。（所谓的&#8220;计算机条例&#8221;是允许为了学习、研究而进行相关逆向工程的，哈哈）。</strike></div><br />好吧，架不住国人的热情，这里是下载地址，需要翻X，你懂得！<div style="display: inline-block; "></div><span class="Apple-style-span" style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff; "><a href="http://dl.dropbox.com/u/22951342/jrebel.jar" target="_new" style="color: navy; text-decoration: none; ">http://dl.dropbox.com/u/22951342/jrebel.jar</a>&nbsp;&nbsp;</span><br /><br />[关键字： JRebel, JavaRebel, JRebel Crack, JRebel License, JavaRebel License]<br /><img src ="http://www.blogjava.net/xylz/aggbug/352109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2011-06-12 00:24 <a href="http://www.blogjava.net/xylz/archive/2011/06/12/352109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>当Ajax遭遇GBK编码 (完全解决方案)</title><link>http://www.blogjava.net/xylz/archive/2011/06/10/352073.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Fri, 10 Jun 2011 15:46:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2011/06/10/352073.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/352073.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2011/06/10/352073.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/352073.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/352073.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 当Ajax遇到GBK/GB2312，我们恨不能将所有项目的编码统一改为UTF-8。显然这个做法，成本太高了。下面给出了一个完善的解决方案。此方案不仅仅限于Ajax提交数据，也适用于普通访问请求。&nbsp;&nbsp;<a href='http://www.blogjava.net/xylz/archive/2011/06/10/352073.html'>阅读全文</a><img src ="http://www.blogjava.net/xylz/aggbug/352073.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2011-06-10 23:46 <a href="http://www.blogjava.net/xylz/archive/2011/06/10/352073.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CRACK xmind 3.2.1 PRO功能</title><link>http://www.blogjava.net/xylz/archive/2011/04/07/347837.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Thu, 07 Apr 2011 15:56:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2011/04/07/347837.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/347837.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2011/04/07/347837.html#Feedback</comments><slash:comments>135</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/347837.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/347837.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 迫于很多项目的格式都是xmind的，最近从mindmanager迁移到xmind了，发现免费的东西国人还是很喜欢的，要是将收费功能免费化就更好了。本来想支持下国产软件，一看那PRO版价格，算了，还是老老实实用免费的吧。<br>xmind介绍点击这里和这里。思维导图介绍点击这里。<br>好吧，我努力下，将最新的xmind【截止2011/4/7版本】pro版本功能挖掘出来。下面是一个智能截图[pro]功能的使用截图。我使用了其它一些PRO功能发现都可以使用，包括导出，但是没有完全使用所有PRO功能，如果还有请告知吧。<br>另外，这不需要帐户进行登录就可以使用所有PRO功能。&nbsp;&nbsp;<a href='http://www.blogjava.net/xylz/archive/2011/04/07/347837.html'>阅读全文</a><img src ="http://www.blogjava.net/xylz/aggbug/347837.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2011-04-07 23:56 <a href="http://www.blogjava.net/xylz/archive/2011/04/07/347837.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入浅出 Java Concurrency (34): 线程池 part 7 线程池的实现及原理 (2)</title><link>http://www.blogjava.net/xylz/archive/2011/02/11/344091.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Fri, 11 Feb 2011 15:48:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2011/02/11/344091.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/344091.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2011/02/11/344091.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/344091.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/344091.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这一节中我们将详细讨论线程池是如何执行一个任务的，尤其是如何处理线程池的大小、核心大小、最大大小、任务队列等之间的关系的。&nbsp;&nbsp;<a href='http://www.blogjava.net/xylz/archive/2011/02/11/344091.html'>阅读全文</a><img src ="http://www.blogjava.net/xylz/aggbug/344091.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2011-02-11 23:48 <a href="http://www.blogjava.net/xylz/archive/2011/02/11/344091.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个身份证号码的基础验证</title><link>http://www.blogjava.net/xylz/archive/2011/01/05/342330.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Wed, 05 Jan 2011 02:00:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2011/01/05/342330.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/342330.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2011/01/05/342330.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/342330.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/342330.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本着开发的原则，既然用到了别人家的东西，所以决定公开出来，也算是给别人一个参考。&nbsp;&nbsp;<a href='http://www.blogjava.net/xylz/archive/2011/01/05/342330.html'>阅读全文</a><img src ="http://www.blogjava.net/xylz/aggbug/342330.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2011-01-05 10:00 <a href="http://www.blogjava.net/xylz/archive/2011/01/05/342330.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入浅出 Java Concurrency (29): 线程池 part 2 Executor 以及Executors</title><link>http://www.blogjava.net/xylz/archive/2010/12/21/341281.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Tue, 21 Dec 2010 15:32:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2010/12/21/341281.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/341281.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2010/12/21/341281.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/341281.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/341281.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Java里面线程池的顶级接口是Executor，但是严格意义上讲Executor并不是一个线程池，而只是一个执行线程的工具。真正的线程池接口是ExecutorService。<br>下面这张图完整描述了线程池的类体系结构。&nbsp;&nbsp;<a href='http://www.blogjava.net/xylz/archive/2010/12/21/341281.html'>阅读全文</a><img src ="http://www.blogjava.net/xylz/aggbug/341281.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2010-12-21 23:32 <a href="http://www.blogjava.net/xylz/archive/2010/12/21/341281.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ibatis 2.x日志记录（SQL调试）分析</title><link>http://www.blogjava.net/xylz/archive/2010/12/05/339844.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Sun, 05 Dec 2010 07:17:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2010/12/05/339844.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/339844.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2010/12/05/339844.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/339844.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/339844.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 最近的项目使用的是旧的ibatis2.x版本，有时候为了方便调试，想输出SQL执行的语句和参数。我记得应该有某些logger的日志级别修改为DEBUG就可以看到。当然为了方便可以直接在log4j（如果使用log4j的话）的root日志级别修改为DEBUG，并且输出appender的接受级别修改为DEBUG就可以了。这样是可以看到日志信息（SQL/参数）等，但是同时也输出了过多的其它logger信息，显然在一个稍微大一点的系统里面debug的信息应该都是非常多的，不说别的，光是spring的日志就够好多页了。<br>为了解决过多的日志，翻出ibatis源码，看了下。ibatis的执行流程大致是这样的。&nbsp;&nbsp;<a href='http://www.blogjava.net/xylz/archive/2010/12/05/339844.html'>阅读全文</a><img src ="http://www.blogjava.net/xylz/aggbug/339844.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2010-12-05 15:17 <a href="http://www.blogjava.net/xylz/archive/2010/12/05/339844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java常见疑惑和陷阱（PPT）</title><link>http://www.blogjava.net/xylz/archive/2010/12/03/339722.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Fri, 03 Dec 2010 08:13:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2010/12/03/339722.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/339722.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2010/12/03/339722.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/339722.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/339722.html</trackback:ping><description><![CDATA[本来是打算小范围内讨论的，话题也比较小，后来听说人多了，临时拼凑些材料。话题过大后重点就放在讲解上，其实这里面讲解的东东还是挺多的。以后有时间会将并发完整整理一次。<br />
<br />
<br />
<br />
<div style="width: 425px;" id="__ss_6013919"><strong style="display: block; margin: 12px 0pt 4px;"><a href="http://www.slideshare.net/xylz/java-6013919" title="Java常见疑惑和陷阱">Java常见疑惑和陷阱</a></strong><object id="__sse6013919" width="425" height="355">
<param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=java-101203020649-phpapp02&stripped_title=java-6013919&userName=xylz" />
<param name="allowFullScreen" value="true"/>
<param name="allowScriptAccess" value="always"/><embed name="__sse6013919" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=java-101203020649-phpapp02&stripped_title=java-6013919&userName=xylz" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="padding: 5px 0pt 12px;">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/xylz">xylz</a>.</div>
</div><img src ="http://www.blogjava.net/xylz/aggbug/339722.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2010-12-03 16:13 <a href="http://www.blogjava.net/xylz/archive/2010/12/03/339722.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【广告】淘宝招聘高级JAVA开发工程师</title><link>http://www.blogjava.net/xylz/archive/2010/11/02/336813.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Tue, 02 Nov 2010 08:09:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2010/11/02/336813.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/336813.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2010/11/02/336813.html#Feedback</comments><slash:comments>19</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/336813.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/336813.html</trackback:ping><description><![CDATA[<p style="padding-bottom: 0px; line-height: 21px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: tahoma,helvetica,arial,sans-serif; color: #4d4d4d; font-size: 14px; padding-top: 0px"><span style="font-family: 宋体">职位名称：高级</span>JAVA<span style="font-family: 宋体">开发工程师</span></p>
<p style="padding-bottom: 0px; line-height: 21px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: tahoma,helvetica,arial,sans-serif; color: #4d4d4d; font-size: 14px; padding-top: 0px"><span style="font-family: 宋体">招聘数量：若干（我们组估计还需要6~8人）</span></p>
<p style="padding-bottom: 0px; line-height: 21px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: tahoma,helvetica,arial,sans-serif; color: #4d4d4d; font-size: 14px; padding-top: 0px"><span style="font-family: 宋体">工作地点：北京（注意不是杭州）</span></p>
<p style="padding-bottom: 0px; line-height: 21px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: tahoma,helvetica,arial,sans-serif; color: #4d4d4d; font-size: 14px; padding-top: 0px"><span style="font-family: 宋体">岗位职责：</span></p>
<p style="padding-bottom: 0px; line-height: 21px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: tahoma,helvetica,arial,sans-serif; color: #4d4d4d; font-size: 14px; padding-top: 0px"><span style="font-family: 宋体">参与淘宝新业务产品系统设计与编码工作，负责业务项目的开发和维护，负责各项目的设计，制定和评审各种技术规范。</span></p>
<p style="padding-bottom: 0px; line-height: 21px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: tahoma,helvetica,arial,sans-serif; color: #4d4d4d; font-size: 14px; padding-top: 0px"><span style="font-family: 宋体">具体要求：</span></p>
<p style="padding-bottom: 0px; line-height: 21px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: tahoma,helvetica,arial,sans-serif; color: #4d4d4d; font-size: 14px; padding-top: 0px">. <span style="font-family: 宋体">计算机相关专业大学本科以上学历，具有扎实的计算机基础理论知识；【只需要学校好点就行，面试的时候少被相关人士歧视下】</span></p>
<p style="padding-bottom: 0px; line-height: 21px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: tahoma,helvetica,arial,sans-serif; color: #4d4d4d; font-size: 14px; padding-top: 0px">. <span style="font-family: 宋体">三年以上使用</span>Java<span style="font-family: 宋体">语言进行网站开发的经验；【两年也考虑吧，一年左右的就算了，不想带人学习】</span></p>
<p style="padding-bottom: 0px; line-height: 21px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: tahoma,helvetica,arial,sans-serif; color: #4d4d4d; font-size: 14px; padding-top: 0px">. <span style="font-family: 宋体">熟悉</span>Web JSP,Servlet,Java Bean,JMS,EJB,Jdbc<span style="font-family: 宋体">开发，熟悉</span>J2EE<span style="font-family: 宋体">规范；【估计每一个人都会这么说】</span></p>
<p style="padding-bottom: 0px; line-height: 21px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: tahoma,helvetica,arial,sans-serif; color: #4d4d4d; font-size: 14px; padding-top: 0px">. <span style="font-family: 宋体">熟悉基于数据库的设计和开发；【这是啥玩意儿需求】</span></p>
<p style="padding-bottom: 0px; line-height: 21px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: tahoma,helvetica,arial,sans-serif; color: #4d4d4d; font-size: 14px; padding-top: 0px">. <span style="font-family: 宋体">熟悉</span>Linux<span style="font-family: 宋体">操作系统和大型数据库；【评论：这个是扯淡，基本上用不着，淘宝划分的太细了】</span></p>
<p style="padding-bottom: 0px; line-height: 21px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: tahoma,helvetica,arial,sans-serif; color: #4d4d4d; font-size: 14px; padding-top: 0px">. <span style="font-family: 宋体">工作认真，细心，有条理；积极性高，求知欲强；具有较强的沟通能力及团队合作精神；【虚的，没啥意思】</span></p>
<p style="padding-bottom: 0px; line-height: 21px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: tahoma,helvetica,arial,sans-serif; color: #4d4d4d; font-size: 14px; padding-top: 0px">. <span style="font-family: 宋体">有招聘等行业开发经验者优先；【不是必须，但是会做相关工作】</span></p>
<p style="padding-bottom: 0px; line-height: 21px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: tahoma,helvetica,arial,sans-serif; color: #4d4d4d; font-size: 14px; padding-top: 0px">. <span style="font-family: 宋体">深入了解设计模式和项目管理经验者优先；【不是必须，有一点讨论起来容易点】</span></p>
<p style="padding-bottom: 0px; line-height: 21px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: tahoma,helvetica,arial,sans-serif; color: #4d4d4d; font-size: 14px; padding-top: 0px"> =====</p>
<p style="padding-bottom: 0px; line-height: 21px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: tahoma,helvetica,arial,sans-serif; color: #4d4d4d; font-size: 14px; padding-top: 0px">以上是官方说明，先补充几点：</p>
<p style="padding-bottom: 0px; line-height: 21px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: tahoma,helvetica,arial,sans-serif; color: #4d4d4d; font-size: 14px; padding-top: 0px">（1）熟悉淘宝webx框架的绝对优先</p>
<p style="padding-bottom: 0px; line-height: 21px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: tahoma,helvetica,arial,sans-serif; color: #4d4d4d; font-size: 14px; padding-top: 0px">（2）目前系统还很烂，所以技术比较初级，但是需要ibatis和velocity相关技术。</p>
<p style="padding-bottom: 0px; line-height: 21px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: tahoma,helvetica,arial,sans-serif; color: #4d4d4d; font-size: 14px; padding-top: 0px">（3）如果有一些设计思想或者经历就更好了（比如UML/架构/模型等）</p>
<p style="padding-bottom: 0px; line-height: 21px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: tahoma,helvetica,arial,sans-serif; color: #4d4d4d; font-size: 14px; padding-top: 0px">其它的就算了，有亮点先说明。</p>
<p style="padding-bottom: 0px; line-height: 21px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: tahoma,helvetica,arial,sans-serif; color: #4d4d4d; font-size: 14px; padding-top: 0px">&nbsp;</p>
<p style="padding-bottom: 0px; line-height: 21px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: tahoma,helvetica,arial,sans-serif; color: #4d4d4d; font-size: 14px; padding-top: 0px"><s>联系方式: 暂时不招了</s></p>
<p style="padding-bottom: 0px; line-height: 21px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: tahoma,helvetica,arial,sans-serif; color: #4d4d4d; font-size: 14px; padding-top: 0px">&nbsp;</p>
<p style="padding-bottom: 0px; line-height: 21px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: tahoma,helvetica,arial,sans-serif; color: #4d4d4d; font-size: 14px; padding-top: 0px">PS: 有意向的先发个简历过来，不想发简历的也可以先用邮件沟通下。</p>
<p style="padding-bottom: 0px; line-height: 21px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: tahoma,helvetica,arial,sans-serif; color: #4d4d4d; font-size: 14px; padding-top: 0px">有兴趣的可以先看看《<a href="http://www.zhuoqun.net/html/y2010/1535.html" target="_blank">技术文化和惨淡命运 —— 怀念中国雅虎</a>》，有个心理准备，仅供参考。</p>
<p style="padding-bottom: 0px; line-height: 21px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: tahoma,helvetica,arial,sans-serif; color: #4d4d4d; font-size: 14px; padding-top: 0px">&nbsp;</p>
<p style="padding-bottom: 0px; line-height: 21px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: tahoma,helvetica,arial,sans-serif; color: #4d4d4d; font-size: 14px; padding-top: 0px">【最后更新时间：2011.3.30 11:11】</p><img src ="http://www.blogjava.net/xylz/aggbug/336813.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2010-11-02 16:09 <a href="http://www.blogjava.net/xylz/archive/2010/11/02/336813.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>这是JVM的Bug么？谁遇到下面的情况？</title><link>http://www.blogjava.net/xylz/archive/2010/08/12/328589.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Wed, 11 Aug 2010 16:54:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2010/08/12/328589.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/328589.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2010/08/12/328589.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/328589.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/328589.html</trackback:ping><description><![CDATA[<p>我在CentOS release 5.3 (Final)遇到一种情况：</p>
<p>一个类的所有public static final字段中，按照定义的从上往下顺序，到一个字段为止，此字段的上面的所有字段都能访问，此字段下面（包括子字段）都不能访问。</p>
<p>具体是这样的：resin环境下一个jsp访问一个类的某个字段，在web请求此jsp的时候被告知编译jsp失败，原因是：cannot find symbol。并指明了此类的哪一个字段。具体分析后发现此字段的上面所有字段都可以访问，此字段的下面字段（包括自己）都不能访问。但是诡异的是，在jsp中使用Class.getField()或者getFields()遍历是可以拿到此字段的，并且此字段是完整的，可用的。</p>
<p>也就是说JVM实例化了一个类，完成了所有字段的初始化，但是在将所有字段设置为对外可见时失败了，导致一部分字段对外是不可见的，但是此类却成功初始化，并对外可用了。这里所说的对外可见不是说字段设置为非public，而是类外根本就看不到，因为如果是非public的话会得到一个访问修饰符不可见的错误，但是现在得到是不存在此符号。这只是我的猜想，并不一定正确。</p>
<p>我的JVM版本如下：</p>
<p>java version "1.6.0_10"<br />
Java(TM) SE Runtime Environment (build 1.6.0_10-b33)<br />
Java HotSpot(TM) 64-Bit Server VM (build 11.0-b15, mixed mode) </p>
<p>其中resin比较老，是3.0.21 pro版本。特别说明的是，这种情况是偶尔才出现，重启resin就消失了，所有字段可以正常访问。我一共遇到了两次，目前仍然不知道是JVM的bug还是resin的bug。 </p>
<p>&nbsp; </p>
<p>第二个诡异的事情是，听同事（两个以上人看过现象）描述他写了一个单例，如下： </p>
<blockquote>
<p>public class Singleton {  </p>
<p>&nbsp;&nbsp;&nbsp; private static final Singleton instance = new Singleton();  </p>
<p>&nbsp;&nbsp;&nbsp; private Singleton() {<br />
&nbsp;&nbsp;&nbsp; }  </p>
<p>&nbsp;&nbsp;&nbsp; public static Singleton getInstance() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return instance;<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
</blockquote>
<p>然后去调用getInstance()，结果居然得到一个null。特别说明的是 没有ClassNotFoundException异常，没有java.lang.ExceptionInInitializerError异常，也没有java.lang.NoClassDefFoundError异常，没有任何异常，是一个真真正正的null。</p>
<p>当然了，比较诡异的是重启JVM就没有此现象了。此现象我没有重现过，也没有看到过，只是道途听说，不好过多评论。</p>
<p>&nbsp;</p>
<p>以上两个问题有谁遇到过么？</p>
<p>难道是RP问题？灵异事件？JVM BUG？</p><img src ="http://www.blogjava.net/xylz/aggbug/328589.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2010-08-12 00:54 <a href="http://www.blogjava.net/xylz/archive/2010/08/12/328589.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《深入浅出 Java Concurrency》暂停两天更新</title><link>http://www.blogjava.net/xylz/archive/2010/07/16/326286.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Fri, 16 Jul 2010 03:59:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2010/07/16/326286.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/326286.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2010/07/16/326286.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/326286.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/326286.html</trackback:ping><description><![CDATA[<p>自从开了这个专题后发现时间明显不够用。前段时间几乎是每天一篇的速度更新，但是没写一篇都需要花3个小时以上的时间。这一方面是对知识的理解和经验不够，另一方面也确实是花了很多的时间做相关知识的准备和处理。</p> <p>每写一篇文章需要考虑适用的场合，相关的设计思想和理论知识，代码中是如何实现，收集别人是何如理解和应用的，查阅相关的资料等等，感觉体力活比脑力活还要多。一句话，精力不够！</p> <p>另外还有一个原因就是个人组织文料的能力不够，其实也是经验不足罢了，所以在操作上也是比较耗费精力的。</p> <p>但是“时间挤挤还是有的”，所以从下周开始还是会继续更新的。这个周末好好考虑下，重新规划下接下来的章节该怎么进行。先休息两天吧。</p><img src ="http://www.blogjava.net/xylz/aggbug/326286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2010-07-16 11:59 <a href="http://www.blogjava.net/xylz/archive/2010/07/16/326286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入浅出 Java Concurrency (14): 锁机制 part 9 读写锁 (ReentrantReadWriteLock) (2)</title><link>http://www.blogjava.net/xylz/archive/2010/07/15/326152.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Wed, 14 Jul 2010 16:41:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2010/07/15/326152.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/326152.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2010/07/15/326152.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/326152.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/326152.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:  <br>这一节主要是谈谈读写锁的实现。<br>上一节中提到，ReadWriteLock看起来有两个锁：readLock/writeLock。如果真的是两个锁的话，它们之间又是如何相互影响的呢？<br>事实上在ReentrantReadWriteLock里锁的实现是靠java.util.concurrent.locks.ReentrantReadWriteLock.Sync完成的。这个类看起来比较眼熟，实际上它是AQS的一个子类，这中类似的结构在CountDownLatch、ReentrantLock、Semaphore里面都存在。同样它也有两种实现：公平锁和非公平锁，也就是java.util.concurrent.locks.ReentrantReadWriteLock.FairSync和java.util.concurrent.locks.ReentrantReadWriteLock.NonfairSync。这里暂且不提。<br>在ReentrantReadWriteLock里面的锁主体就是一个Sync，也就是上面提到的FairSync或者NonfairSync，所以说实际&nbsp;&nbsp;<a href='http://www.blogjava.net/xylz/archive/2010/07/15/326152.html'>阅读全文</a><img src ="http://www.blogjava.net/xylz/aggbug/326152.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2010-07-15 00:41 <a href="http://www.blogjava.net/xylz/archive/2010/07/15/326152.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入浅出 Java Concurrency (13): 锁机制 part 8 读写锁 (ReentrantReadWriteLock) (1)</title><link>http://www.blogjava.net/xylz/archive/2010/07/14/326080.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Wed, 14 Jul 2010 06:18:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2010/07/14/326080.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/326080.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2010/07/14/326080.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/326080.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/326080.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 从这一节开始介绍锁里面的最后一个工具：读写锁(ReadWriteLock)。<br>ReentrantLock 实现了标准的互斥操作，也就是一次只能有一个线程持有锁，也即所谓独占锁的概念。前面的章节中一直在强调这个特点。显然这个特点在一定程度上面减低了吞吐量，实际上独占锁是一种保守的锁策略，在这种情况下任何“读/读”，“写/读”，“写/写”操作都不能同时发生。但是同样需要强调的一个概念是，锁是有一定的开销的，当并发比较大的时候，锁的开销就比较客观了。所以如果可能的话就尽量少用锁，非要用锁的话就尝试看能否改造为读写锁。<br>ReadWriteLock描述的是：一个资源能够被多个读线程访问，或者被一个写线程访问，但是不能同时存在读写线程。也就是说读写锁使用的场合是一个共享资源被大量读取操作，而只有少量的写操作（修改数据）。清单1描述了ReadWriteLock的API。&nbsp;&nbsp;<a href='http://www.blogjava.net/xylz/archive/2010/07/14/326080.html'>阅读全文</a><img src ="http://www.blogjava.net/xylz/aggbug/326080.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2010-07-14 14:18 <a href="http://www.blogjava.net/xylz/archive/2010/07/14/326080.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入浅出 Java Concurrency (12): 锁机制 part 7 信号量（Semaphore）</title><link>http://www.blogjava.net/xylz/archive/2010/07/13/326021.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Tue, 13 Jul 2010 14:41:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2010/07/13/326021.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/326021.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2010/07/13/326021.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/326021.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/326021.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Semaphore 是一个计数信号量。从概念上讲，信号量维护了一个许可集。如有必要，在许可可用前会阻塞每一个 acquire()，然后再获取该许可。每个 release() 添加一个许可，从而可能释放一个正在阻塞的获取者。但是，不使用实际的许可对象，Semaphore 只对可用许可的号码进行计数，并采取相应的行动。<br>说白了，Semaphore是一个计数器，在计数器不为0的时候对线程就放行，一旦达到0，那么所有请求资源的新线程都会被阻塞，包括增加请求到许可的线程，也就是说Semaphore不是可重入的。每一次请求一个许可都会导致计数器减少1，同样每次释放一个许可都会导致计数器增加1，一旦达到了0，新的许可请求线程将被挂起。<br>缓存池整好使用此思想来实现的，比如链接池、对象池等。&nbsp;&nbsp;<a href='http://www.blogjava.net/xylz/archive/2010/07/13/326021.html'>阅读全文</a><img src ="http://www.blogjava.net/xylz/aggbug/326021.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2010-07-13 22:41 <a href="http://www.blogjava.net/xylz/archive/2010/07/13/326021.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入浅出 Java Concurrency (11): 锁机制 part 6 CyclicBarrier</title><link>http://www.blogjava.net/xylz/archive/2010/07/12/325913.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Mon, 12 Jul 2010 15:33:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2010/07/12/325913.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/325913.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2010/07/12/325913.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/325913.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/325913.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:  <br>如果说CountDownLatch是一次性的，那么CyclicBarrier正好可以循环使用。它允许一组线程互相等待，直到到达某个公共屏障点 (common barrier point)。所谓屏障点就是一组任务执行完毕的时刻。<br> &nbsp;&nbsp;<a href='http://www.blogjava.net/xylz/archive/2010/07/12/325913.html'>阅读全文</a><img src ="http://www.blogjava.net/xylz/aggbug/325913.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2010-07-12 23:33 <a href="http://www.blogjava.net/xylz/archive/2010/07/12/325913.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入浅出 Java Concurrency (10): 锁机制 part 5 闭锁 (CountDownLatch)</title><link>http://www.blogjava.net/xylz/archive/2010/07/09/325612.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Fri, 09 Jul 2010 01:21:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2010/07/09/325612.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/325612.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2010/07/09/325612.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/325612.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/325612.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 此小节介绍几个与锁有关的有用工具。<br>闭锁（Latch）<br>闭锁（Latch）：一种同步方法，可以延迟线程的进度直到线程到达某个终点状态。通俗的讲就是，一个闭锁相当于一扇大门，在大门打开之前所有线程都被阻断，一旦大门打开所有线程都将通过，但是一旦大门打开，所有线程都通过了，那么这个闭锁的状态就失效了，门的状态也就不能变了，只能是打开状态。也就是说闭锁的状态是一次性的，它确保在闭锁打开之前所有特定的活动都需要在闭锁打开之后才能完成。<br>CountDownLatch是JDK 5+里面闭锁的一个实现，允许一个或者多个线程等待某个事件的发生。CountDownLatch有一个正数计数器，countDown方法对计数器做减操作，await方法等待计数器达到0。所有await的线程都会阻塞直到计数器为0或者等待线程中断或者超时。&nbsp;&nbsp;<a href='http://www.blogjava.net/xylz/archive/2010/07/09/325612.html'>阅读全文</a><img src ="http://www.blogjava.net/xylz/aggbug/325612.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2010-07-09 09:21 <a href="http://www.blogjava.net/xylz/archive/2010/07/09/325612.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入浅出 Java Concurrency (9): 锁机制 part 4</title><link>http://www.blogjava.net/xylz/archive/2010/07/08/325540.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Thu, 08 Jul 2010 04:33:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2010/07/08/325540.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/325540.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2010/07/08/325540.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/325540.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/325540.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本小节介绍锁释放Lock.unlock()。<br>Release/TryRelease<br>unlock操作实际上就调用了AQS的release操作，释放持有的锁。&nbsp;&nbsp;<a href='http://www.blogjava.net/xylz/archive/2010/07/08/325540.html'>阅读全文</a><img src ="http://www.blogjava.net/xylz/aggbug/325540.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2010-07-08 12:33 <a href="http://www.blogjava.net/xylz/archive/2010/07/08/325540.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入浅出 Java Concurrency (8): 锁机制 part 3</title><link>http://www.blogjava.net/xylz/archive/2010/07/07/325410.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Tue, 06 Jul 2010 16:05:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2010/07/07/325410.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/325410.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2010/07/07/325410.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/325410.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/325410.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 接上篇，这篇从Lock.lock/unlock开始。特别说明在没有特殊情况下所有程序、API、文档都是基于JDK 6.0的。<br>在没有深入了解内部机制及实现之前，先了解下为什么会存在公平锁和非公平锁。公平锁保证一个阻塞的线程最终能够获得锁，因为是有序的，所以总是可以按照请求的顺序获得锁。不公平锁意味着后请求锁的线程可能在其前面排列的休眠线程恢复前拿到锁，这样就有可能提高并发的性能。这是因为通常情况下挂起的线程重新开始与它真正开始运行，二者之间会产生严重的延时。因此非公平锁就可以利用这段时间完成操作。这是非公平锁在某些时候比公平锁性能要好的原因之一。&nbsp;&nbsp;<a href='http://www.blogjava.net/xylz/archive/2010/07/07/325410.html'>阅读全文</a><img src ="http://www.blogjava.net/xylz/aggbug/325410.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2010-07-07 00:05 <a href="http://www.blogjava.net/xylz/archive/2010/07/07/325410.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入浅出 Java Concurrency (7): 锁机制 part 2 AQS</title><link>http://www.blogjava.net/xylz/archive/2010/07/06/325390.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Tue, 06 Jul 2010 10:29:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2010/07/06/325390.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/325390.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2010/07/06/325390.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/325390.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/325390.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在理解J.U.C原理以及锁机制之前，我们来介绍J.U.C框架最核心也是最复杂的一个基础类：java.util.concurrent.locks.AbstractQueuedSynchronizer。<br><br>AQS<br>AbstractQueuedSynchronizer，简称AQS，是J.U.C最复杂的一个类，导致绝大多数讲解并发原理或者实战的时候都不会提到此类。但是虚心的作者愿意借助自己有限的能力和精力来探讨一二（参考资源中也有一些作者做了部分的分析。）。<br>首先从理论知识开始，在了解了相关原理后会针对源码进行一些分析，最后加上一些实战来描述。&nbsp;&nbsp;<a href='http://www.blogjava.net/xylz/archive/2010/07/06/325390.html'>阅读全文</a><img src ="http://www.blogjava.net/xylz/aggbug/325390.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2010-07-06 18:29 <a href="http://www.blogjava.net/xylz/archive/2010/07/06/325390.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入浅出 Java Concurrency (6): 锁机制 part 1</title><link>http://www.blogjava.net/xylz/archive/2010/07/05/325274.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Mon, 05 Jul 2010 05:37:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2010/07/05/325274.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/325274.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2010/07/05/325274.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/325274.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/325274.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 前面的章节主要谈谈原子操作，至于与原子操作一些相关的问题或者说陷阱就放到最后的总结篇来整体说明。从这一章开始花少量的篇幅谈谈锁机制。<br>上一个章节中谈到了锁机制，并且针对于原子操作谈了一些相关的概念和设计思想。接下来的文章中，尽可能的深入研究锁机制，并且理解里面的原理和实际应用场合。<br>尽管synchronized在语法上已经足够简单了，在JDK 5之前只能借助此实现，但是由于是独占锁，性能却不高，因此JDK 5以后就开始借助于JNI来完成更高级的锁实现。<br>JDK 5中的锁是接口java.util.concurrent.locks.Lock。另外java.util.concurrent.locks.ReadWriteLock提供了一对可供读写并发的锁。根据前面的规则，我们从java.util.concurrent.locks.Lock的API开始。&nbsp;&nbsp;<a href='http://www.blogjava.net/xylz/archive/2010/07/05/325274.html'>阅读全文</a><img src ="http://www.blogjava.net/xylz/aggbug/325274.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2010-07-05 13:37 <a href="http://www.blogjava.net/xylz/archive/2010/07/05/325274.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入浅出 Java Concurrency (5): 原子操作 part 4</title><link>http://www.blogjava.net/xylz/archive/2010/07/04/325206.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Sun, 04 Jul 2010 10:03:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2010/07/04/325206.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/325206.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2010/07/04/325206.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/325206.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/325206.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在JDK 5之前Java语言是靠synchronized关键字保证同步的，这会导致有锁（后面的章节还会谈到锁）。<br>锁机制存在以下问题：<br>（1）在多线程竞争下，加锁、释放锁会导致比较多的上下文切换和调度延时，引起性能问题。<br>（2）一个线程持有锁会导致其它所有需要此锁的线程挂起。<br>（3）如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置，引起性能风险。<br>volatile是不错的机制，但是volatile不能保证原子性。因此对于同步最终还是要回到锁机制上来。<br>独占锁是一种悲观锁，synchronized就是一种独占锁，会导致其它所有需要锁的线程挂起，等待持有锁的线程释放锁。而另一个更加有效的锁就是乐观锁。所谓乐观锁就是，每次不加锁而是假设没有冲突而去完成某项操作，如果因为冲突失败就重试，直到成功为止。&nbsp;&nbsp;<a href='http://www.blogjava.net/xylz/archive/2010/07/04/325206.html'>阅读全文</a><img src ="http://www.blogjava.net/xylz/aggbug/325206.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2010-07-04 18:03 <a href="http://www.blogjava.net/xylz/archive/2010/07/04/325206.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入浅出 Java Concurrency (4): 原子操作 part 3 指令重排序与happens-before法则</title><link>http://www.blogjava.net/xylz/archive/2010/07/03/325168.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Sat, 03 Jul 2010 12:40:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2010/07/03/325168.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/325168.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2010/07/03/325168.html#Feedback</comments><slash:comments>16</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/325168.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/325168.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在这个小结里面重点讨论原子操作的原理和设计思想。<br>由于在下一个章节中会谈到锁机制，因此此小节中会适当引入锁的概念。<br>在Java Concurrency in Practice中是这样定义线程安全的：<br>当多个线程访问一个类时，如果不用考虑这些线程在运行时环境下的调度和交替运行，并且不需要额外的同步及在调用方代码不必做其他的协调，这个类的行为仍然是正确的，那么这个类就是线程安全的。&nbsp;&nbsp;<a href='http://www.blogjava.net/xylz/archive/2010/07/03/325168.html'>阅读全文</a><img src ="http://www.blogjava.net/xylz/aggbug/325168.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2010-07-03 20:40 <a href="http://www.blogjava.net/xylz/archive/2010/07/03/325168.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>