﻿<?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-zhangxl_blog-文章分类-java 并发</title><link>http://www.blogjava.net/zhanglongsr/category/49255.html</link><description>路漫漫其修远兮，吾将上下而求索！</description><language>zh-cn</language><lastBuildDate>Tue, 29 Jan 2019 08:59:12 GMT</lastBuildDate><pubDate>Tue, 29 Jan 2019 08:59:12 GMT</pubDate><ttl>60</ttl><item><title>ReentrantLock源码之二unlock方法解析(锁的释放)</title><link>http://www.blogjava.net/zhanglongsr/articles/356864.html</link><dc:creator>zhangxl</dc:creator><author>zhangxl</author><pubDate>Fri, 19 Aug 2011 07:24:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglongsr/articles/356864.html</guid><wfw:comment>http://www.blogjava.net/zhanglongsr/comments/356864.html</wfw:comment><comments>http://www.blogjava.net/zhanglongsr/articles/356864.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglongsr/comments/commentRss/356864.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglongsr/services/trackbacks/356864.html</trackback:ping><description><![CDATA[在<a href="http://www.blogjava.net/zhanglongsr/articles/356782.html">前面一节</a>中，我们分析了ReentrantLock.lock()方法，接下来我们接着分析ReentrantLock.unlock()方法。<br />
<p>1.ReentrantLock.unlock()分析</p>
<p>(1)首先尝试释放锁，如果要求释放数等于锁状态数，那么将锁状态位清0，清除锁所有者，返回true；否则返回false;<br />(2)如果(1)返回的是true，说明锁完全释放。接下来将检查等待队列，并选择一个waitStatus处于等待状态的节点下的线程unpark(恢复)，选择的依据是从尾节点开始，选取最靠近头节点的等待节点,同时清理队列中线程被取消的节点；<br />(3)如果(1)返回false，说明锁只是部分释放，当前线程仍旧持有该锁；</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">java.util.concurrent.locks.ReentrantLock<br /></span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img id="Codehighlighter1_63_91_Open_Image" onclick="this.style.display='none'; Codehighlighter1_63_91_Open_Text.style.display='none'; Codehighlighter1_63_91_Closed_Image.style.display='inline'; Codehighlighter1_63_91_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_63_91_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_63_91_Closed_Text.style.display='none'; Codehighlighter1_63_91_Open_Image.style.display='inline'; Codehighlighter1_63_91_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top">&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;unlock()&nbsp;</span><span id="Codehighlighter1_63_91_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_63_91_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sync.release(</span><span style="color: #000000">1</span><span style="color: #000000">);<br /></span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;}</span></span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />java.util.concurrent.locks.AbstractQueuedSynchronizer<br /></span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img id="Codehighlighter1_186_394_Open_Image" onclick="this.style.display='none'; Codehighlighter1_186_394_Open_Text.style.display='none'; Codehighlighter1_186_394_Closed_Image.style.display='inline'; Codehighlighter1_186_394_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_186_394_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_186_394_Closed_Text.style.display='none'; Codehighlighter1_186_394_Open_Image.style.display='inline'; Codehighlighter1_186_394_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;release(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;arg)&nbsp;</span><span id="Codehighlighter1_186_394_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_186_394_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img id="Codehighlighter1_217_366_Open_Image" onclick="this.style.display='none'; Codehighlighter1_217_366_Open_Text.style.display='none'; Codehighlighter1_217_366_Closed_Image.style.display='inline'; Codehighlighter1_217_366_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_217_366_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_217_366_Closed_Text.style.display='none'; Codehighlighter1_217_366_Open_Image.style.display='inline'; Codehighlighter1_217_366_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(tryRelease(arg))&nbsp;</span><span id="Codehighlighter1_217_366_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_217_366_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;h&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;head;<br /></span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(h&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;h.waitStatus&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)<br /></span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unparkSuccessor(h);<br /></span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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 /></span><span style="color: #008080">13</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /></span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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">;<br /></span><span style="color: #008080">15</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /></span><span style="color: #008080">16</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="color: #008080">18</span><span style="color: #000000"><img id="Codehighlighter1_448_914_Open_Image" onclick="this.style.display='none'; Codehighlighter1_448_914_Open_Text.style.display='none'; Codehighlighter1_448_914_Closed_Image.style.display='inline'; Codehighlighter1_448_914_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_448_914_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_448_914_Closed_Text.style.display='none'; Codehighlighter1_448_914_Open_Image.style.display='inline'; Codehighlighter1_448_914_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;tryRelease(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;releases)&nbsp;</span><span id="Codehighlighter1_448_914_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_448_914_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">19</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;c&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getState()&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;releases;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">重入锁加锁的次数-释放数量</span><span style="color: #008000"><br /></span><span style="color: #008080">20</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(Thread.currentThread()&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;getExclusiveOwnerThread())&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">判断独占锁是否为当前线程所有</span><span style="color: #008000"><br /></span><span style="color: #008080">21</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></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">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;IllegalMonitorStateException();<br /></span><span style="color: #008080">22</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;free&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br /></span><span style="color: #008080">23</span><span style="color: #000000"><img id="Codehighlighter1_715_838_Open_Image" onclick="this.style.display='none'; Codehighlighter1_715_838_Open_Text.style.display='none'; Codehighlighter1_715_838_Closed_Image.style.display='inline'; Codehighlighter1_715_838_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_715_838_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_715_838_Closed_Text.style.display='none'; Codehighlighter1_715_838_Open_Image.style.display='inline'; Codehighlighter1_715_838_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(c&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_715_838_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_715_838_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">加锁次数=释放数量</span><span style="color: #008000"><br /></span><span style="color: #008080">24</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br /></span><span style="color: #008080">25</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setExclusiveOwnerThread(</span><span style="color: #0000ff">null</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">清除锁拥有者标识</span><span style="color: #008000"><br /></span><span style="color: #008080">26</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /></span><span style="color: #008080">27</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setState(c);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">设置加锁状态</span><span style="color: #008000"><br /></span><span style="color: #008080">28</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;free;<br /></span><span style="color: #008080">29</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /></span><span style="color: #008080">30</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="color: #008080">31</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="color: #008080">32</span><span style="color: #000000"><img id="Codehighlighter1_919_1013_Open_Image" onclick="this.style.display='none'; Codehighlighter1_919_1013_Open_Text.style.display='none'; Codehighlighter1_919_1013_Closed_Image.style.display='inline'; Codehighlighter1_919_1013_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_919_1013_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_919_1013_Closed_Text.style.display='none'; Codehighlighter1_919_1013_Open_Image.style.display='inline'; Codehighlighter1_919_1013_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;</span><span id="Codehighlighter1_919_1013_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_919_1013_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br /></span><span style="color: #008080">33</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Wakes&nbsp;up&nbsp;node's&nbsp;successor,&nbsp;if&nbsp;one&nbsp;exists.<br /></span><span style="color: #008080">34</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br /></span><span style="color: #008080">35</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;node&nbsp;the&nbsp;node<br /></span><span style="color: #008080">36</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /></span><span style="color: #008080">37</span><span style="color: #000000"><img id="Codehighlighter1_1059_1934_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1059_1934_Open_Text.style.display='none'; Codehighlighter1_1059_1934_Closed_Image.style.display='inline'; Codehighlighter1_1059_1934_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_1059_1934_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1059_1934_Closed_Text.style.display='none'; Codehighlighter1_1059_1934_Open_Image.style.display='inline'; Codehighlighter1_1059_1934_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;unparkSuccessor(Node&nbsp;node)&nbsp;</span><span id="Codehighlighter1_1059_1934_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1059_1934_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">38</span><span style="color: #000000"><img id="Codehighlighter1_1069_1222_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1069_1222_Open_Text.style.display='none'; Codehighlighter1_1069_1222_Closed_Image.style.display='inline'; Codehighlighter1_1069_1222_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_1069_1222_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1069_1222_Closed_Text.style.display='none'; Codehighlighter1_1069_1222_Open_Image.style.display='inline'; Codehighlighter1_1069_1222_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1069_1222_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_1069_1222_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000"><br /></span><span style="color: #008080">39</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Try&nbsp;to&nbsp;clear&nbsp;status&nbsp;in&nbsp;anticipation&nbsp;of&nbsp;signalling.&nbsp;&nbsp;It&nbsp;is<br /></span><span style="color: #008080">40</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;OK&nbsp;if&nbsp;this&nbsp;fails&nbsp;or&nbsp;if&nbsp;status&nbsp;is&nbsp;changed&nbsp;by&nbsp;waiting&nbsp;thread.<br /></span><span style="color: #008080">41</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /></span><span style="color: #008080">42</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;compareAndSetWaitStatus(node,&nbsp;Node.SIGNAL,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">清除头节点signal状态</span><span style="color: #008000"><br /></span><span style="color: #008080">43</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000"><br /></span><span style="color: #008080">44</span><span style="color: #000000"><img id="Codehighlighter1_1307_1552_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1307_1552_Open_Text.style.display='none'; Codehighlighter1_1307_1552_Closed_Image.style.display='inline'; Codehighlighter1_1307_1552_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_1307_1552_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1307_1552_Closed_Text.style.display='none'; Codehighlighter1_1307_1552_Open_Image.style.display='inline'; Codehighlighter1_1307_1552_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1307_1552_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_1307_1552_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000"><br /></span><span style="color: #008080">45</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Thread&nbsp;to&nbsp;unpark&nbsp;is&nbsp;held&nbsp;in&nbsp;successor,&nbsp;which&nbsp;is&nbsp;normally<br /></span><span style="color: #008080">46</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;just&nbsp;the&nbsp;next&nbsp;node.&nbsp;&nbsp;But&nbsp;if&nbsp;cancelled&nbsp;or&nbsp;apparently&nbsp;null,<br /></span><span style="color: #008080">47</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;traverse&nbsp;backwards&nbsp;from&nbsp;tail&nbsp;to&nbsp;find&nbsp;the&nbsp;actual<br /></span><span style="color: #008080">48</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;non-cancelled&nbsp;successor.<br /></span><span style="color: #008080">49</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /></span><span style="color: #008080">50</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;s&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;node.next;<br /></span><span style="color: #008080">51</span><span style="color: #000000"><img id="Codehighlighter1_1625_1863_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1625_1863_Open_Text.style.display='none'; Codehighlighter1_1625_1863_Closed_Image.style.display='inline'; Codehighlighter1_1625_1863_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_1625_1863_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1625_1863_Closed_Text.style.display='none'; Codehighlighter1_1625_1863_Open_Image.style.display='inline'; Codehighlighter1_1625_1863_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(s&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;s.waitStatus&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_1625_1863_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1625_1863_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">等待队列唤醒的竞争满足FIFO，本段代码主要是寻找最靠近头节点的，且waitStatus为signal、condition的链表节点</span><span style="color: #008000"><br /></span><span style="color: #008080">52</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br /></span><span style="color: #008080">53</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(Node&nbsp;t&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tail;&nbsp;t&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;t&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;node;&nbsp;t&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;t.prev)<br /></span><span style="color: #008080">54</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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">&nbsp;(t.waitStatus&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)<br /></span><span style="color: #008080">55</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;t;<br /></span><span style="color: #008080">56</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /></span><span style="color: #008080">57</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(s&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br /></span><span style="color: #008080">58</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LockSupport.unpark(s.thread);<br /></span><span style="color: #008080">59</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<p><br /></p><img src ="http://www.blogjava.net/zhanglongsr/aggbug/356864.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglongsr/" target="_blank">zhangxl</a> 2011-08-19 15:24 <a href="http://www.blogjava.net/zhanglongsr/articles/356864.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ReentrantLock源码之一lock方法解析(锁的获取)</title><link>http://www.blogjava.net/zhanglongsr/articles/356782.html</link><dc:creator>zhangxl</dc:creator><author>zhangxl</author><pubDate>Thu, 18 Aug 2011 06:12:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglongsr/articles/356782.html</guid><wfw:comment>http://www.blogjava.net/zhanglongsr/comments/356782.html</wfw:comment><comments>http://www.blogjava.net/zhanglongsr/articles/356782.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglongsr/comments/commentRss/356782.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglongsr/services/trackbacks/356782.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一、前言&nbsp;&nbsp;&nbsp;&nbsp;ReentrantLock是JDK1.5引入的，它拥有与synchronized相同的并发性和内存语义，并提供了超出synchonized的其他高级功能(例如，中断锁等候、条件变量等)，并且使用ReentrantLock比synchronized能获得更好的可伸缩性。&nbsp;&nbsp;&nbsp;&nbsp;ReentrantL...&nbsp;&nbsp;<a href='http://www.blogjava.net/zhanglongsr/articles/356782.html'>阅读全文</a><img src ="http://www.blogjava.net/zhanglongsr/aggbug/356782.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglongsr/" target="_blank">zhangxl</a> 2011-08-18 14:12 <a href="http://www.blogjava.net/zhanglongsr/articles/356782.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 等待通知/条件变量的区别浅析</title><link>http://www.blogjava.net/zhanglongsr/articles/355210.html</link><dc:creator>zhangxl</dc:creator><author>zhangxl</author><pubDate>Thu, 28 Jul 2011 04:11:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglongsr/articles/355210.html</guid><wfw:comment>http://www.blogjava.net/zhanglongsr/comments/355210.html</wfw:comment><comments>http://www.blogjava.net/zhanglongsr/articles/355210.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglongsr/comments/commentRss/355210.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglongsr/services/trackbacks/355210.html</trackback:ping><description><![CDATA[<div>&nbsp;&nbsp;&nbsp;&nbsp;java在1.2版本引入wait-and-notify机制，用于线程间通信，它能够让某个线程与其他线程在特定条件符合时进行通信；而条件变量是在1.5版本中concurrency包中提供的，条件变量是一种有其多其他多线程系统所提供的同步类型，它与java的wai-and-notify机制非常类似，下面我们通过实例的方式来探讨他们之间的区别。<br />&nbsp;&nbsp;&nbsp;&nbsp; wai-and-notify示例代码： 
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.zxl.thread.notify;<br /><img id="Codehighlighter1_31_63_Open_Image" onclick="this.style.display='none'; Codehighlighter1_31_63_Open_Text.style.display='none'; Codehighlighter1_31_63_Closed_Image.style.display='inline'; Codehighlighter1_31_63_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_31_63_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_31_63_Closed_Text.style.display='none'; Codehighlighter1_31_63_Open_Image.style.display='inline'; Codehighlighter1_31_63_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_31_63_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_31_63_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;zhangxl<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img id="Codehighlighter1_104_1175_Open_Image" onclick="this.style.display='none'; Codehighlighter1_104_1175_Open_Text.style.display='none'; Codehighlighter1_104_1175_Closed_Image.style.display='inline'; Codehighlighter1_104_1175_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_104_1175_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_104_1175_Closed_Text.style.display='none'; Codehighlighter1_104_1175_Open_Image.style.display='inline'; Codehighlighter1_104_1175_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SynThread1&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Thread&nbsp;</span><span id="Codehighlighter1_104_1175_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_104_1175_Open_Text"><span style="color: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Object&nbsp;lockObj;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">volatile</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">;<br /><img id="Codehighlighter1_196_225_Open_Image" onclick="this.style.display='none'; Codehighlighter1_196_225_Open_Text.style.display='none'; Codehighlighter1_196_225_Closed_Image.style.display='inline'; Codehighlighter1_196_225_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_196_225_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_196_225_Closed_Text.style.display='none'; Codehighlighter1_196_225_Open_Image.style.display='inline'; Codehighlighter1_196_225_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;SynThread1(Object&nbsp;lockObj)</span><span id="Codehighlighter1_196_225_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_196_225_Open_Text"><span style="color: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.lockObj&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;lockObj;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img id="Codehighlighter1_246_662_Open_Image" onclick="this.style.display='none'; Codehighlighter1_246_662_Open_Text.style.display='none'; Codehighlighter1_246_662_Closed_Image.style.display='inline'; Codehighlighter1_246_662_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_246_662_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_246_662_Closed_Text.style.display='none'; Codehighlighter1_246_662_Open_Image.style.display='inline'; Codehighlighter1_246_662_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&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()</span><span id="Codehighlighter1_246_662_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_246_662_Open_Text"><span style="color: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img id="Codehighlighter1_274_659_Open_Image" onclick="this.style.display='none'; Codehighlighter1_274_659_Open_Text.style.display='none'; Codehighlighter1_274_659_Closed_Image.style.display='inline'; Codehighlighter1_274_659_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_274_659_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_274_659_Closed_Text.style.display='none'; Codehighlighter1_274_659_Open_Image.style.display='inline'; Codehighlighter1_274_659_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">synchronized</span><span style="color: #000000">(lockObj)</span><span id="Codehighlighter1_274_659_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_274_659_Open_Text"><span style="color: #000000">{<br /><img id="Codehighlighter1_290_655_Open_Image" onclick="this.style.display='none'; Codehighlighter1_290_655_Open_Text.style.display='none'; Codehighlighter1_290_655_Closed_Image.style.display='inline'; Codehighlighter1_290_655_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_290_655_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_290_655_Closed_Text.style.display='none'; Codehighlighter1_290_655_Open_Image.style.display='inline'; Codehighlighter1_290_655_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(</span><span style="color: #0000ff">true</span><span style="color: #000000">)</span><span id="Codehighlighter1_290_655_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_290_655_Open_Text"><span style="color: #000000">{<br /><img id="Codehighlighter1_304_541_Open_Image" onclick="this.style.display='none'; Codehighlighter1_304_541_Open_Text.style.display='none'; Codehighlighter1_304_541_Closed_Image.style.display='inline'; Codehighlighter1_304_541_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_304_541_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_304_541_Closed_Text.style.display='none'; Codehighlighter1_304_541_Open_Image.style.display='inline'; Codehighlighter1_304_541_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&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">(i</span><span style="color: #000000">==</span><span style="color: #000000">0</span><span style="color: #000000">)</span><span id="Codehighlighter1_304_541_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_304_541_Open_Text"><span style="color: #000000">{<br /><img id="Codehighlighter1_315_427_Open_Image" onclick="this.style.display='none'; Codehighlighter1_315_427_Open_Text.style.display='none'; Codehighlighter1_315_427_Closed_Image.style.display='inline'; Codehighlighter1_315_427_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_315_427_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_315_427_Closed_Text.style.display='none'; Codehighlighter1_315_427_Open_Image.style.display='inline'; Codehighlighter1_315_427_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&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">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_315_427_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_315_427_Open_Text"><span style="color: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Thread.currentThread().getName()</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;will&nbsp;be&nbsp;waiting<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lockObj.wait();<br /><img id="Codehighlighter1_460_535_Open_Image" onclick="this.style.display='none'; Codehighlighter1_460_535_Open_Text.style.display='none'; Codehighlighter1_460_535_Closed_Image.style.display='inline'; Codehighlighter1_460_535_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_460_535_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_460_535_Closed_Text.style.display='none'; Codehighlighter1_460_535_Open_Image.style.display='inline'; Codehighlighter1_460_535_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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 id="Codehighlighter1_460_535_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_460_535_Open_Text"><span style="color: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  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 src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Thread.currentThread().getName()</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">:&nbsp;i=</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">i);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">i++;</span><span style="color: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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">(i</span><span style="color: #000000">&gt;=</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img id="Codehighlighter1_705_1173_Open_Image" onclick="this.style.display='none'; Codehighlighter1_705_1173_Open_Text.style.display='none'; Codehighlighter1_705_1173_Closed_Image.style.display='inline'; Codehighlighter1_705_1173_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_705_1173_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_705_1173_Closed_Text.style.display='none'; Codehighlighter1_705_1173_Open_Image.style.display='inline'; Codehighlighter1_705_1173_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&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;&nbsp;main(String[]&nbsp;arg)</span><span id="Codehighlighter1_705_1173_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_705_1173_Open_Text"><span style="color: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;lock&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Object();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SynThread1&nbsp;t1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SynThread1(lock);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t1.setName(</span><span style="color: #000000">"</span><span style="color: #000000">SynThread_1</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SynThread1&nbsp;t2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SynThread1(lock);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t2.setName(</span><span style="color: #000000">"</span><span style="color: #000000">SynThread_2</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t2.start();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t1.start();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img id="Codehighlighter1_924_1071_Open_Image" onclick="this.style.display='none'; Codehighlighter1_924_1071_Open_Text.style.display='none'; Codehighlighter1_924_1071_Closed_Image.style.display='inline'; Codehighlighter1_924_1071_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_924_1071_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_924_1071_Closed_Text.style.display='none'; Codehighlighter1_924_1071_Open_Image.style.display='inline'; Codehighlighter1_924_1071_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_924_1071_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_924_1071_Open_Text"><span style="color: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="color: #000000">1000</span><span style="color: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img id="Codehighlighter1_974_1067_Open_Image" onclick="this.style.display='none'; Codehighlighter1_974_1067_Open_Text.style.display='none'; Codehighlighter1_974_1067_Closed_Image.style.display='inline'; Codehighlighter1_974_1067_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_974_1067_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_974_1067_Closed_Text.style.display='none'; Codehighlighter1_974_1067_Open_Image.style.display='inline'; Codehighlighter1_974_1067_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">synchronized</span><span style="color: #000000">(lock)</span><span id="Codehighlighter1_974_1067_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_974_1067_Open_Text"><span style="color: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lock.notify();&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">通过结果观察，sun&nbsp;JVM(hotspot)的通知机制极有可能是FIFO的策略，原因是t1、t2只要谁先启动，谁就将被唤醒。</span><span style="color: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img id="Codehighlighter1_1104_1170_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1104_1170_Open_Text.style.display='none'; Codehighlighter1_1104_1170_Closed_Image.style.display='inline'; Codehighlighter1_1104_1170_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_1104_1170_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1104_1170_Closed_Text.style.display='none'; Codehighlighter1_1104_1170_Open_Image.style.display='inline'; Codehighlighter1_1104_1170_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top">&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 id="Codehighlighter1_1104_1170_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1104_1170_Open_Text"><span style="color: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;TODO&nbsp;Aut o-generated&nbsp;catch&nbsp;block</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div><br /><br />条件变量示例：<br />
<p>package com.zxl.thread.notify;</p>
<p>import java.util.concurrent.locks.Condition;<br />import java.util.concurrent.locks.ReentrantLock;</p>
<p>public class ConditionThread implements Runnable {<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;private ReentrantLock lock;<br />&nbsp;<br />&nbsp;private Condition c;<br />&nbsp;<br />&nbsp;private volatile int i=0;<br />&nbsp;<br />&nbsp;public ConditionThread(ReentrantLock lock){<br />&nbsp;&nbsp;this.lock = lock;<br />&nbsp;&nbsp;c = lock.newCondition();<br />&nbsp;}</p>
<p>&nbsp;public void run() {<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;lock.lock();<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;try{<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;while(true){<br />&nbsp;&nbsp;&nbsp;&nbsp;if(i==0){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Thread.currentThread().getName()+" will be waiting...");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.await();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Thread.currentThread().getName()+" is already waked up,i="+i);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(i&gt;=1) return;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;} catch (InterruptedException e) {<br />&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;finally{<br />&nbsp;&nbsp;&nbsp;lock.unlock();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;}<br />&nbsp;<br />&nbsp;public Condition getCondition(){<br />&nbsp;&nbsp;return c;<br />&nbsp;}<br />&nbsp;<br />&nbsp;public static void main(String[] args){<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;ReentrantLock lock = new ReentrantLock();<br />&nbsp;&nbsp;ConditionThread ct1 = new ConditionThread(lock);<br />&nbsp;&nbsp;ConditionThread ct2 = new ConditionThread(lock);<br />&nbsp;&nbsp;Thread t1 = new Thread(ct1);<br />&nbsp;&nbsp;t1.setName("C_Thread_1");<br />&nbsp;&nbsp;Thread t2 = new Thread(ct2);<br />&nbsp;&nbsp;t2.setName("C_Thread_2");<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;t1.start();<br />&nbsp;&nbsp;t2.start();<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;Thread.sleep(1000);<br />&nbsp;&nbsp;} catch (InterruptedException e) {<br />&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;lock.lock();<br />&nbsp;&nbsp;ct1.getCondition().signal();&nbsp;&nbsp; //唤醒第一个线程<br />&nbsp;&nbsp;lock.unlock();<br />&nbsp;}</p>
<p>}<br /></p><br /><br /><br /><br /><br /><br /><br /><br /></div><img src ="http://www.blogjava.net/zhanglongsr/aggbug/355210.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglongsr/" target="_blank">zhangxl</a> 2011-07-28 12:11 <a href="http://www.blogjava.net/zhanglongsr/articles/355210.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>