﻿<?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-joe --专注java,开源,架构,项目管理-随笔分类-concurrent</title><link>http://www.blogjava.net/freeman1984/category/49019.html</link><description>         
        STANDING ON THE SHOULDERS OF GIANTS</description><language>zh-cn</language><lastBuildDate>Wed, 19 Oct 2011 11:28:06 GMT</lastBuildDate><pubDate>Wed, 19 Oct 2011 11:28:06 GMT</pubDate><ttl>60</ttl><item><title>Condition </title><link>http://www.blogjava.net/freeman1984/archive/2011/10/17/361462.html</link><dc:creator>@joe</dc:creator><author>@joe</author><pubDate>Mon, 17 Oct 2011 09:28:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2011/10/17/361462.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/361462.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2011/10/17/361462.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/361462.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/361462.html</trackback:ping><description><![CDATA[<p><tt>Condition（条件）</tt> 将 <tt>Object</tt> 监视器方法（<code>wait</code>、<code>notify</code> 和 <code>notifyAll</code>）分解成截然不同的对象，以便通过将这些对象与任意 <code>Lock</code> 实现组合使用，为每个对象提供多个等待 set （wait-set）。其中，<tt>Lock</tt> 替代了 <tt>synchronized</tt> 方法和语句的使用，<tt>Condition</tt> 替代了 Object 监视器方法的使用。 <br />下面解释下<font face="Courier New">Condition</font> api里面的例子(生产者，消费者)：<br /></p>
<p>public class ConditionTest {</p>
<p>&nbsp;final Lock lock = new ReentrantLock();<br />&nbsp;&nbsp;&nbsp;&nbsp; final Condition notFull&nbsp; = lock.newCondition(); //生产者的前提条件，没有达到次条件就阻塞<br />&nbsp;&nbsp;&nbsp;&nbsp; final Condition notEmpty = lock.newCondition(); //消费者的前提条件，没有达到次条件就阻塞<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; final Object[] items = new Object[100];<br />&nbsp;&nbsp;&nbsp;&nbsp; int putptr, takeptr, count;<br />&nbsp;&nbsp;//生产<br />&nbsp;&nbsp;&nbsp;&nbsp; public void put(Object x) throws InterruptedException {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lock.lock();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (count == items.length)//如果满了，就让需要条件为：没满的的线程(生产者)等<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; notFull.await();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; items[putptr] = x;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (++putptr == items.length) putptr = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ++count;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; notEmpty.signal();//如果已经生产了，就让需要条件为不为空的线程(消费者)执行<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } finally {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lock.unlock();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp; //消费<br />&nbsp;&nbsp;&nbsp;&nbsp; public Object take() throws InterruptedException {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lock.lock();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (count == 0)//如果为空就让需要条件为不为空的线程(消费者)等<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; notEmpty.await();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object x = items[takeptr];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (++takeptr == items.length) takeptr = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --count;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; notFull.signal();//如果消费了，就让条件为不满的线程(生产者)执行<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return x;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } finally {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lock.unlock();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp; }</p>
<p>&nbsp;</p><img src ="http://www.blogjava.net/freeman1984/aggbug/361462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">@joe</a> 2011-10-17 17:28 <a href="http://www.blogjava.net/freeman1984/archive/2011/10/17/361462.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ReadWriteLock</title><link>http://www.blogjava.net/freeman1984/archive/2011/10/17/361454.html</link><dc:creator>@joe</dc:creator><author>@joe</author><pubDate>Mon, 17 Oct 2011 08:59:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2011/10/17/361454.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/361454.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2011/10/17/361454.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/361454.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/361454.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 线程读写同一个对象的数据是很普遍的，通常，要避免读写冲突，必须保证任何时候仅有一个线程在写入，有线程正在读取的时候，写入操作就必须等待。简单说，就是要避免&#8220;写-写&#8221;冲突和&#8220;读-写&#8221;冲突。但是同时读是允许的，因为&#8220;读-读&#8221;不冲突，而且很安全。<br />&nbsp; 冲jdk1.5开始可以使用ReadWriteLock类来防止读写冲突.它有一个已有的实现ReentrantReadWriteLock。<br />ReentrantReadWriteLock使用内部维护的读写锁来防止读写冲突；<br />&nbsp; 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img id="Codehighlighter1_54_75_Open_Image" onclick="this.style.display='none'; Codehighlighter1_54_75_Open_Text.style.display='none'; Codehighlighter1_54_75_Closed_Image.style.display='inline'; Codehighlighter1_54_75_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_54_75_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_54_75_Closed_Text.style.display='none'; Codehighlighter1_54_75_Open_Image.style.display='inline'; Codehighlighter1_54_75_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;ReentrantReadWriteLock.WriteLock&nbsp;writeLock()&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_54_75_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_54_75_Open_Text"><span style="color: #000000">{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;writerLock;&nbsp;}</span></span><span style="color: #000000"><br /><img id="Codehighlighter1_133_154_Open_Image" onclick="this.style.display='none'; Codehighlighter1_133_154_Open_Text.style.display='none'; Codehighlighter1_133_154_Closed_Image.style.display='inline'; Codehighlighter1_133_154_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_133_154_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_133_154_Closed_Text.style.display='none'; Codehighlighter1_133_154_Open_Image.style.display='inline'; Codehighlighter1_133_154_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;ReentrantReadWriteLock.ReadLock&nbsp;&nbsp;readLock()&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_133_154_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_133_154_Open_Text"><span style="color: #000000">{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;readerLock;&nbsp;}</span></span></div>示例代码如下：<br /><br />
<p>public class RreadWriteLockTest {</p>
<p>&nbsp; ReadWriteLock readWriteLock = new ReentrantReadWriteLock();<br />&nbsp; public int i&nbsp; = 0;<br />//读取<br />&nbsp;public void read() throws InterruptedException{<br />&nbsp;&nbsp;readWriteLock.readLock().lock();//获取读锁<br />&nbsp;&nbsp;System.out.println("read thread:"+Thread.currentThread().getName());<br />&nbsp;&nbsp;Thread.sleep(10000);<br />&nbsp;&nbsp;System.out.println("read:"+i);<br />&nbsp; readWriteLock.readLock().unlock();<br />&nbsp;}<br />//写入<br />&nbsp;public void write() throws InterruptedException{<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;readWriteLock.writeLock().lock();//获取写锁<br />&nbsp;&nbsp;System.out.println("write thread:"+Thread.currentThread().getName());<br />&nbsp;&nbsp;Thread.sleep(10000);<br />&nbsp;&nbsp;i = 2;<br />&nbsp;&nbsp;System.out.println("write:"+i);<br />readWriteLock.writeLock().unlock();<br />&nbsp;}<br />}<br />测试代码：<br />1 测试两个同时读的，结果都能同时读取。<br />2 测试一个读，一个写的，需要其中一个释放锁之后才能进行另外一个操作<br />public static void main(String[] args) throws InterruptedException {<br />&nbsp;&nbsp;final RreadWriteLockTest lockTest= new RreadWriteLockTest();<br />&nbsp;&nbsp;new Thread(new Runnable() {<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;public void run() {<br />&nbsp;&nbsp;&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lockTest.write();<br />&nbsp;&nbsp;&nbsp;&nbsp;} catch (InterruptedException e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}).start();<br />&nbsp;&nbsp;Thread.sleep(2000);<br />&nbsp;new Thread(new Runnable() {<br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;public void run() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lockTest.read();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch (InterruptedException e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}).start();<br />&nbsp;}<br />打印如下：<br />write thread:Thread-0执行完之后(10秒之后)才执行read thread:Thread-1<br /><br /><span style="color: red">注意：执行完以后一定要执行unlock，要不lock的计数没有-1，这样对应read或者write的操作将无法进行，一直等待。</span></p><img src ="http://www.blogjava.net/freeman1984/aggbug/361454.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">@joe</a> 2011-10-17 16:59 <a href="http://www.blogjava.net/freeman1984/archive/2011/10/17/361454.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>synchronized 要注意的地方</title><link>http://www.blogjava.net/freeman1984/archive/2011/10/17/361403.html</link><dc:creator>@joe</dc:creator><author>@joe</author><pubDate>Mon, 17 Oct 2011 02:56:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2011/10/17/361403.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/361403.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2011/10/17/361403.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/361403.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/361403.html</trackback:ping><description><![CDATA[<p>在Java1.5之前，synchronized应该是最常用的java支持并发手段。那synchronized是怎么做到的了，从java1.0开始，java中的每个对象就一个内部锁。如果一个类的方法被synchronized关键字所修饰，那么这个对象的锁将保护整个方法。</p>
<p>举例来说：</p>
<p>public synchronized void method(){</p>
<p>&nbsp;&nbsp;&nbsp; method body</p>
<p>}</p>
<p>等价于</p>
<p>public void method(){</p>
<p>&nbsp;&nbsp;&nbsp; this.intrinsicLock.lock();</p>
<p>&nbsp;&nbsp;&nbsp; try{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method body;</p>
<p>&nbsp;&nbsp;&nbsp; }finally(){</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.intrinsicLock.unlock();</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p>&nbsp;</p>
<p>从上面的代码示例可以看出，synchronized的使用方式是比较简单的。这也导致了大量的初学者在碰到java编程的时候落入陷阱里，认为既然synhronized可以搞定一切，那么不管三七二十一，只要有并发可能性的地方，就加上synchronized的关键字，这显然是不对的。在java对象中，这个java对象只有这一个内部锁，其中一个synchronized方法获取到了这个锁，另外一个synchronized方法的调用将被阻塞。</p>
<p>即</p>
<p>class sync{</p>
<p>&nbsp;&nbsp;&nbsp; public synchronized void methodA(){};</p>
<p>&nbsp;&nbsp;&nbsp; public synchronized void methodB(){};</p>
<p>&nbsp;&nbsp;&nbsp; ... ...</p>
<p>&nbsp;</p>
<p>}</p>
<p>methodA 和methodB在初始就是互斥的，如果methodA和methodB进入互相等待，就很容易出现死锁的情况。那如果碰到这种情况，应该怎么做了？常用的方式是在方法内部新建一个无意义的对象，然后对这个无意义的对象加锅。</p>
<p>&nbsp;</p>
<div class="dp-highlighter bg_java">
<div class="bar">
<div class="tools"><a class="ViewSource" title="view plain" href="http://blog.csdn.net/sunnydogzhou/article/details/6553960#">view plain</a><a class="CopyToClipboard" title="copy to clipboard" href="http://blog.csdn.net/sunnydogzhou/article/details/6553960#">copy to clipboard</a><a class="PrintSource" title="print" href="http://blog.csdn.net/sunnydogzhou/article/details/6553960#">print</a><a class="About" title="?" href="http://blog.csdn.net/sunnydogzhou/article/details/6553960#">?</a></div></div>
<ol class="dp-j"><li class="alt"><span class="keyword">package</span><span>&nbsp;zl.study.concurrency.synchronize;&nbsp;&nbsp;</span></li><li><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Sync&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;i;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;plus(){&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;dummy&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Object();&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">synchronized</span><span>(dummy){&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;minus(){&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;dummy&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Object();&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">synchronized</span><span>(dummy){&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i--;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li><span>}&nbsp;&nbsp;</span></li></ol></div>&nbsp;
<p>另外需要注意的是将静态类声明为synchronized方法也是合法的。举例来说，如果Sync有一个static synchronized方法，那么这个方法被调用时,bank.class这个类对象本身在jvm中将被锁住</p><img src ="http://www.blogjava.net/freeman1984/aggbug/361403.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">@joe</a> 2011-10-17 10:56 <a href="http://www.blogjava.net/freeman1984/archive/2011/10/17/361403.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AtomicInteger</title><link>http://www.blogjava.net/freeman1984/archive/2011/10/17/361402.html</link><dc:creator>@joe</dc:creator><author>@joe</author><pubDate>Mon, 17 Oct 2011 02:53:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2011/10/17/361402.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/361402.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2011/10/17/361402.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/361402.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/361402.html</trackback:ping><description><![CDATA[<div class="article_content">
<p>AtomicInteger，一个提供原子操作的Integer的类。在Java语言中，++i和i++操作并不是线程安全的，在使用的时候，不可避免的会用到synchronized关键字。而AtomicInteger则通过一种线程安全的加减操作接口。</p>
<p>来看AtomicInteger提供的接口。</p>
<p>//获取当前的值</p>
<p>public final int get()</p>
<p>//取当前的值，并设置新的值</p>
<p>&nbsp;public final int getAndSet(int newValue)</p>
<p>//获取当前的值，并自增</p>
<p>&nbsp;public final int getAndIncrement() </p>
<p>//获取当前的值，并自减</p>
<p>public final int getAndDecrement()</p>
<p>//获取当前的值，并加上预期的值</p>
<p>public final int getAndAdd(int delta) </p>
<p>... ...</p>
<p>我们在上一节提到的CAS主要是这两个方法</p>
<p>&nbsp;&nbsp;&nbsp; public final boolean compareAndSet(int expect, int update) {<br />&nbsp;&nbsp;&nbsp; return unsafe.compareAndSwapInt(this, valueOffset, expect, update);<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public final boolean weakCompareAndSet(int expect, int update) {<br />&nbsp;&nbsp;&nbsp; return unsafe.compareAndSwapInt(this, valueOffset, expect, update);<br />&nbsp;&nbsp;&nbsp; }</p>
<p>这两个方法是名称不同，但是做的事是一样的，可能在后续的java版本里面会显示出区别来。</p>
<p>详细查看会发现，这两个接口都是调用一个unsafe的类来操作，这个是通过JNI实现的本地方法，细节就不考虑了。</p>
<p>&nbsp;</p>
<p>下面是一个对比测试，我们写一个synchronized的方法和一个AtomicInteger的方法来进行测试，直观的感受下性能上的差异</p>
<p>&nbsp;</p>
<div class="dp-highlighter bg_java">
<div class="bar">
<div class="tools"><u><font color="#0000ff"></font></u>&nbsp;</div></div>
<ol class="dp-j"><li class="alt"><span class="keyword">package</span><span>&nbsp;zl.study.concurrency;&nbsp;&nbsp;</span></li><li><span></span><span class="keyword">import</span><span>&nbsp;java.util.concurrent.atomic.AtomicInteger;&nbsp;&nbsp;</span></span></li><li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;AtomicIntegerCompareTest&nbsp;{&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;value;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;AtomicIntegerCompareTest(</span><span class="keyword">int</span><span>&nbsp;value){&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.value&nbsp;=&nbsp;value;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">synchronized</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;increase(){&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;value++;&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String&nbsp;args[]){&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">long</span><span>&nbsp;start&nbsp;=&nbsp;System.currentTimeMillis();&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AtomicIntegerCompareTest&nbsp;test&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;AtomicIntegerCompareTest(</span><span class="number">0</span><span>);&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(&nbsp;</span><span class="keyword">int</span><span>&nbsp;i=</span><span class="number">0</span><span>;i&lt;&nbsp;</span><span class="number">1000000</span><span>;i++){&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test.increase();&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">long</span><span>&nbsp;end&nbsp;=&nbsp;System.currentTimeMillis();&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"time&nbsp;elapse:"</span><span>+(end&nbsp;-start));&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">long</span><span>&nbsp;start1&nbsp;=&nbsp;System.currentTimeMillis();&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AtomicInteger&nbsp;atomic&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;AtomicInteger(</span><span class="number">0</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(&nbsp;</span><span class="keyword">int</span><span>&nbsp;i=</span><span class="number">0</span><span>;i&lt;&nbsp;</span><span class="number">1000000</span><span>;i++){&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;atomic.incrementAndGet();&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">long</span><span>&nbsp;end1&nbsp;=&nbsp;System.currentTimeMillis();&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"time&nbsp;elapse:"</span><span>+(end1&nbsp;-start1)&nbsp;);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li><span>}&nbsp;&nbsp;</span></li></ol></div><textarea style="width: 932px; display: none; height: 411px" class="java" rows="8" cols="52" name="code">package zl.study.concurrency;
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicIntegerCompareTest {
	private int value;
	
	public AtomicIntegerCompareTest(int value){
		this.value = value;
	}
	
	public synchronized int increase(){
		return value++;
	}
	
	public static void main(String args[]){
		long start = System.currentTimeMillis();
		
		AtomicIntegerCompareTest test = new AtomicIntegerCompareTest(0);
		for( int i=0;i&lt; 1000000;i++){
			test.increase();
		}
		long end = System.currentTimeMillis();
		System.out.println("time elapse:"+(end -start));
		
		long start1 = System.currentTimeMillis();
		
		AtomicInteger atomic = new AtomicInteger(0);
		
		for( int i=0;i&lt; 1000000;i++){
			atomic.incrementAndGet();
		}
		long end1 = System.currentTimeMillis();
		System.out.println("time elapse:"+(end1 -start1) );
		
		
	}
}
</textarea> 
<p>&nbsp;</p>
<p>结果</p>
<p>time elapse:31<br />time elapse:16<br />由此不难看出，通过JNI本地的CAS性能远超synchronized关键字</p>
<p>&nbsp;</p>
<p>Reference</p>
<p>http://stackoverflow.com/questions/2443239/java-atomicinteger-what-are-the-differences-between-compareandset-and-weakcompar</p></div><img src ="http://www.blogjava.net/freeman1984/aggbug/361402.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">@joe</a> 2011-10-17 10:53 <a href="http://www.blogjava.net/freeman1984/archive/2011/10/17/361402.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CountDownLatch 简介和例子</title><link>http://www.blogjava.net/freeman1984/archive/2011/07/04/353654.html</link><dc:creator>@joe</dc:creator><author>@joe</author><pubDate>Mon, 04 Jul 2011 09:14:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2011/07/04/353654.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/353654.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2011/07/04/353654.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/353654.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/353654.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 在一些应用场合中，某段程序需要等待某个条件达到要求后才能执行，或者等待一定长的时间后此行，从jdk1.5开始就可以使用CountDownLatch实现，&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp; CountDownLatch类是一个同步倒数计数器,构造时传入int参数,该参数就是计数器的初始值，每调用一次countDown()方法，计数器减1,计数器大于0 时，await()方法会阻塞后面程序执行，直到计数器为0，await(long timeout, TimeUnit unit)，是等待一定时间，然后执行，不管计数器是否到0了。<br />下面举一个等车的例子：<br />10个同学上车，车等待同学上车，如果有等待时间限制，到时间就开走，不管学生上没上完。如果没有等待时间，学生上完了再开：
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img id="Codehighlighter1_32_823_Open_Image" onclick="this.style.display='none'; Codehighlighter1_32_823_Open_Text.style.display='none'; Codehighlighter1_32_823_Closed_Image.style.display='inline'; Codehighlighter1_32_823_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_32_823_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_32_823_Closed_Text.style.display='none'; Codehighlighter1_32_823_Open_Image.style.display='inline'; Codehighlighter1_32_823_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;CountDownLatchTest&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_32_823_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_32_823_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;numberOfPeople&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">;</span><span style="color: #008000">//</span><span style="color: #008000">等车的学生数</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;isGone&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;</span><span style="color: #008000">//</span><span style="color: #008000">车开的标志</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;carWaitTime&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">;</span><span style="color: #008000">//</span><span style="color: #008000">车等的时间</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br /><img id="Codehighlighter1_241_453_Open_Image" onclick="this.style.display='none'; Codehighlighter1_241_453_Open_Text.style.display='none'; Codehighlighter1_241_453_Closed_Image.style.display='inline'; Codehighlighter1_241_453_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_241_453_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_241_453_Closed_Text.style.display='none'; Codehighlighter1_241_453_Open_Image.style.display='inline'; Codehighlighter1_241_453_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;InterruptedException&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_241_453_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_241_453_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CountDownLatch&nbsp;waitStudentsGetOn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;CountDownLatch(numberOfPeople);<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Thread(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GetOn(waitStudentsGetOn)).start();<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;waitStudentGetOn(waitStudentsGetOn);</span><span style="color: #008000">//</span><span style="color: #008000">等所有的学生上车</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;driveHome();</span><span style="color: #008000">//</span><span style="color: #008000">开车走</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img id="Codehighlighter1_557_675_Open_Image" onclick="this.style.display='none'; Codehighlighter1_557_675_Open_Text.style.display='none'; Codehighlighter1_557_675_Closed_Image.style.display='inline'; Codehighlighter1_557_675_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_557_675_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_557_675_Closed_Text.style.display='none'; Codehighlighter1_557_675_Open_Image.style.display='inline'; Codehighlighter1_557_675_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;waitStudentGetOn(CountDownLatch&nbsp;waitStudentsGetOn)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;InterruptedException&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_557_675_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_557_675_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">赶紧的,抓紧时间上车..</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;waitStudentsGetOn.await(carWaitTime,&nbsp;TimeUnit.SECONDS);</span><span style="color: #008000">//</span><span style="color: #008000">等5秒，还没上车，就开走。。</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img id="Codehighlighter1_739_819_Open_Image" onclick="this.style.display='none'; Codehighlighter1_739_819_Open_Text.style.display='none'; Codehighlighter1_739_819_Closed_Image.style.display='inline'; Codehighlighter1_739_819_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_739_819_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_739_819_Closed_Text.style.display='none'; Codehighlighter1_739_819_Open_Image.style.display='inline'; Codehighlighter1_739_819_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;driveHome()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;InterruptedException&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_739_819_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_739_819_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">开车，鞋儿破&nbsp;帽儿破&nbsp;身上的袈裟破&nbsp;你笑我&nbsp;他笑我&nbsp;一把扇儿破</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isGone&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img id="Codehighlighter1_856_1934_Open_Image" onclick="this.style.display='none'; Codehighlighter1_856_1934_Open_Text.style.display='none'; Codehighlighter1_856_1934_Closed_Image.style.display='inline'; Codehighlighter1_856_1934_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_856_1934_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_856_1934_Closed_Text.style.display='none'; Codehighlighter1_856_1934_Open_Image.style.display='inline'; Codehighlighter1_856_1934_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;GetOn&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Runnable</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_856_1934_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_856_1934_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;CountDownLatch&nbsp;waitStudentsGetOn;<br /><img id="Codehighlighter1_943_992_Open_Image" onclick="this.style.display='none'; Codehighlighter1_943_992_Open_Text.style.display='none'; Codehighlighter1_943_992_Closed_Image.style.display='inline'; Codehighlighter1_943_992_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_943_992_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_943_992_Closed_Text.style.display='none'; Codehighlighter1_943_992_Open_Image.style.display='inline'; Codehighlighter1_943_992_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;GetOn(CountDownLatch&nbsp;waitStudentsGetOn)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_943_992_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_943_992_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.waitStudentsGetOn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;waitStudentsGetOn;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img id="Codehighlighter1_1013_1548_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1013_1548_Open_Text.style.display='none'; Codehighlighter1_1013_1548_Closed_Image.style.display='inline'; Codehighlighter1_1013_1548_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_1013_1548_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1013_1548_Closed_Text.style.display='none'; Codehighlighter1_1013_1548_Open_Image.style.display='inline'; Codehighlighter1_1013_1548_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;run()&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1013_1548_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1013_1548_Open_Text"><span style="color: #000000">{<br /><img id="Codehighlighter1_1077_1539_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1077_1539_Open_Text.style.display='none'; Codehighlighter1_1077_1539_Closed_Image.style.display='inline'; Codehighlighter1_1077_1539_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_1077_1539_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1077_1539_Closed_Text.style.display='none'; Codehighlighter1_1077_1539_Open_Image.style.display='inline'; Codehighlighter1_1077_1539_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;CountDownLatchTest.numberOfPeople;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1077_1539_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1077_1539_Open_Text"><span style="color: #000000">{<br /><img id="Codehighlighter1_1086_1332_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1086_1332_Open_Text.style.display='none'; Codehighlighter1_1086_1332_Closed_Image.style.display='inline'; Codehighlighter1_1086_1332_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_1086_1332_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1086_1332_Closed_Text.style.display='none'; Codehighlighter1_1086_1332_Open_Image.style.display='inline'; Codehighlighter1_1086_1332_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1086_1332_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1086_1332_Open_Text"><span style="color: #000000">{<br /><img id="Codehighlighter1_1121_1219_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1121_1219_Open_Text.style.display='none'; Codehighlighter1_1121_1219_Closed_Image.style.display='inline'; Codehighlighter1_1121_1219_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_1121_1219_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1121_1219_Closed_Text.style.display='none'; Codehighlighter1_1121_1219_Open_Image.style.display='inline'; Codehighlighter1_1121_1219_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(CountDownLatchTest.isGone)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1121_1219_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1121_1219_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">妈的，还差：</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">waitStudentsGetOn.getCount()</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;个没娃上车呢.怎么车走了</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;goonSuccess&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Student(i</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">).getOn();</span><span style="color: #008000">//</span><span style="color: #008000">顺序上车</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(goonSuccess)waitStudentsGetOn.countDown();<br /><img id="Codehighlighter1_1365_1366_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1365_1366_Open_Text.style.display='none'; Codehighlighter1_1365_1366_Closed_Image.style.display='inline'; Codehighlighter1_1365_1366_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_1365_1366_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1365_1366_Closed_Text.style.display='none'; Codehighlighter1_1365_1366_Open_Image.style.display='inline'; Codehighlighter1_1365_1366_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(InterruptedException&nbsp;e)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1365_1366_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1365_1366_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000"><br /><img id="Codehighlighter1_1408_1488_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1408_1488_Open_Text.style.display='none'; Codehighlighter1_1408_1488_Closed_Image.style.display='inline'; Codehighlighter1_1408_1488_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_1408_1488_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1408_1488_Closed_Text.style.display='none'; Codehighlighter1_1408_1488_Open_Image.style.display='inline'; Codehighlighter1_1408_1488_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(waitStudentsGetOn.getCount()</span><span style="color: #000000">!=</span><span style="color: #000000">0l</span><span style="color: #000000">)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1408_1488_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1408_1488_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">还差：</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">(waitStudentsGetOn.getCount())</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;个没上车<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img id="Codehighlighter1_1493_1535_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1493_1535_Open_Text.style.display='none'; Codehighlighter1_1493_1535_Closed_Image.style.display='inline'; Codehighlighter1_1493_1535_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_1493_1535_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1493_1535_Closed_Text.style.display='none'; Codehighlighter1_1493_1535_Open_Image.style.display='inline'; Codehighlighter1_1493_1535_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">else</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1493_1535_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1493_1535_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">都上车了<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img id="Codehighlighter1_1564_1932_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1564_1932_Open_Text.style.display='none'; Codehighlighter1_1564_1932_Closed_Image.style.display='inline'; Codehighlighter1_1564_1932_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_1564_1932_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1564_1932_Closed_Text.style.display='none'; Codehighlighter1_1564_1932_Open_Image.style.display='inline'; Codehighlighter1_1564_1932_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Student</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1564_1932_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1564_1932_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;myNum;</span><span style="color: #008000">//</span><span style="color: #008000">学生编号</span><span style="color: #008000"><br /><img id="Codehighlighter1_1619_1650_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1619_1650_Open_Text.style.display='none'; Codehighlighter1_1619_1650_Closed_Image.style.display='inline'; Codehighlighter1_1619_1650_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_1619_1650_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1619_1650_Closed_Text.style.display='none'; Codehighlighter1_1619_1650_Open_Image.style.display='inline'; Codehighlighter1_1619_1650_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Student(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;num)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1619_1650_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1619_1650_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.myNum&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;num;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">上车</span><span style="color: #008000"><br /><img id="Codehighlighter1_1713_1929_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1713_1929_Open_Text.style.display='none'; Codehighlighter1_1713_1929_Closed_Image.style.display='inline'; Codehighlighter1_1713_1929_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_1713_1929_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1713_1929_Closed_Text.style.display='none'; Codehighlighter1_1713_1929_Open_Image.style.display='inline'; Codehighlighter1_1713_1929_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;getOn()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;InterruptedException</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1713_1929_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1713_1929_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.currentThread().sleep(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Random().nextInt(</span><span style="color: #000000">2</span><span style="color: #000000">)</span><span style="color: #000000">*</span><span style="color: #000000">1000</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">上车使用的时间，随机</span><span style="color: #008000"><br /><img id="Codehighlighter1_1824_1860_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1824_1860_Open_Text.style.display='none'; Codehighlighter1_1824_1860_Closed_Image.style.display='inline'; Codehighlighter1_1824_1860_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_1824_1860_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1824_1860_Closed_Text.style.display='none'; Codehighlighter1_1824_1860_Open_Image.style.display='inline'; Codehighlighter1_1824_1860_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(CountDownLatchTest.isGone)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1824_1860_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1824_1860_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;</span><span style="color: #008000">//</span><span style="color: #008000">不能上了，上车失败</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(</span><span style="color: #000000">"</span><span style="color: #000000">编号为:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">myNum</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">的同学上车了..</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div><br /> <img src ="http://www.blogjava.net/freeman1984/aggbug/353654.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">@joe</a> 2011-07-04 17:14 <a href="http://www.blogjava.net/freeman1984/archive/2011/07/04/353654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>