reentrantlock.html
来自「j2se5-api-zh,java文档的中文版本」· HTML 代码 · 共 937 行 · 第 1/3 页
HTML
937 行
<TD><CODE><B><A HREF="ReentrantLock.html#tryLock(long, java.util.concurrent.TimeUnit)">tryLock</A></B>(long timeout, <A HREF="../TimeUnit.html" title="java.util.concurrent 中的枚举">TimeUnit</A> unit)</CODE><BR> 如果锁定在给定等待时间内没有被另一个线程保持,且当前线程未被<A HREF="../../../lang/Thread.html#interrupt()"><CODE>中断</CODE></A>,则获取该锁定。</TD></TR><TR BGCOLOR="white" CLASS="TableRowColor"><TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"><CODE> void</CODE></FONT></TD><TD><CODE><B><A HREF="ReentrantLock.html#unlock()">unlock</A></B>()</CODE><BR> 试图释放此锁定。</TD></TR></TABLE> <A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A><TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""><TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor"><TH ALIGN="left"><B>从类 java.lang.<A HREF="../../../lang/Object.html" title="java.lang 中的类">Object</A> 继承的方法</B></TH></TR><TR BGCOLOR="white" CLASS="TableRowColor"><TD><CODE><A HREF="../../../lang/Object.html#clone()">clone</A>, <A HREF="../../../lang/Object.html#equals(java.lang.Object)">equals</A>, <A HREF="../../../lang/Object.html#finalize()">finalize</A>, <A HREF="../../../lang/Object.html#getClass()">getClass</A>, <A HREF="../../../lang/Object.html#hashCode()">hashCode</A>, <A HREF="../../../lang/Object.html#notify()">notify</A>, <A HREF="../../../lang/Object.html#notifyAll()">notifyAll</A>, <A HREF="../../../lang/Object.html#wait()">wait</A>, <A HREF="../../../lang/Object.html#wait(long)">wait</A>, <A HREF="../../../lang/Object.html#wait(long, int)">wait</A></CODE></TD></TR></TABLE> <P><!-- ========= CONSTRUCTOR DETAIL ======== --><A NAME="constructor_detail"><!-- --></A><TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""><TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"><TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2"><B>构造方法详细信息</B></FONT></TH></TR></TABLE><A NAME="ReentrantLock()"><!-- --></A><H3>ReentrantLock</H3><PRE>public <B>ReentrantLock</B>()</PRE><DL><DD>创建一个 <tt>ReentrantLock</tt> 的实例。这等同于使用 <tt>ReentrantLock(false)</tt>。<P></DL><HR><A NAME="ReentrantLock(boolean)"><!-- --></A><H3>ReentrantLock</H3><PRE>public <B>ReentrantLock</B>(boolean fair)</PRE><DL><DD>创建一个具有给定公平策略的 <tt>ReentrantLock</tt>。<P><DL><DT><B>参数:</B><DD><CODE>fair</CODE> - 如果此锁定是公平的,则该参数为 true;否则为 false</DL></DL><!-- ============ METHOD DETAIL ========== --><A NAME="method_detail"><!-- --></A><TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""><TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"><TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2"><B>方法详细信息</B></FONT></TH></TR></TABLE><A NAME="lock()"><!-- --></A><H3>lock</H3><PRE>public void <B>lock</B>()</PRE><DL><DD>获取锁定。 <p>如果该锁定没有被另一个线程保持,则获取该锁定并立即返回,将锁定的保持计数设置为 1。<p>如果当前线程已经保持该锁定,则将保持计数加 1,并且该方法立即返回。<p>如果该锁定被另一个线程保持,则出于线程调度的目的,禁用当前线程,并且在获得锁定之前,该线程将一直处于休眠状态,此时锁定保持计数被设置为 1。<P><DD><DL><DT><B>指定者:</B><DD>接口 <CODE><A HREF="Lock.html" title="java.util.concurrent.locks 中的接口">Lock</A></CODE> 中的 <CODE><A HREF="Lock.html#lock()">lock</A></CODE></DL></DD><DD><DL></DL></DD></DL><HR><A NAME="lockInterruptibly()"><!-- --></A><H3>lockInterruptibly</H3><PRE>public void <B>lockInterruptibly</B>() throws <A HREF="../../../lang/InterruptedException.html" title="java.lang 中的类">InterruptedException</A></PRE><DL><DD>如果当前线程未被<A HREF="../../../lang/Thread.html#interrupt()"><CODE>中断</CODE></A>,则获取锁定。<p>如果该锁定没有被另一个线程保持,则获取该锁定并立即返回,将锁定的保持计数设置为 1。<p>如果当前线程已经保持此锁定,则将保持计数加 1,并且该方法立即返回。<p>如果锁定被另一个线程保持,则出于线程调度目的,禁用当前线程,并且在发生以下两种情况之一以前,该线程将一直处于休眠状态: <ul><li>锁定由当前线程获得;或者<li>其他某个线程<A HREF="../../../lang/Thread.html#interrupt()"><CODE>中断</CODE></A>当前线程。 </ul><p>如果当前线程获得该锁定,则将锁定保持计数设置为 1。<p>如果当前线程: <ul><li>在进入此方法时已经设置了该线程的中断状态;或者<li>在等待获取锁定的同时被<A HREF="../../../lang/Thread.html#interrupt()"><CODE>中断</CODE></A>。 </ul>则抛出 <A HREF="../../../lang/InterruptedException.html" title="java.lang 中的类"><CODE>InterruptedException</CODE></A>,并且清除当前线程的已中断状态。 <p>在此实现中,因为此方法是一个显式中断点,所以要优先考虑响应中断,而不是响应锁定的普通获取或重入获取。<P><DD><DL><DT><B>指定者:</B><DD>接口 <CODE><A HREF="Lock.html" title="java.util.concurrent.locks 中的接口">Lock</A></CODE> 中的 <CODE><A HREF="Lock.html#lockInterruptibly()">lockInterruptibly</A></CODE></DL></DD><DD><DL><DT><B>抛出:</B><DD><CODE><A HREF="../../../lang/InterruptedException.html" title="java.lang 中的类">InterruptedException</A></CODE> - 如果当前线程已中断。<DT><B>另请参见:</B><DD><A HREF="../../../lang/Thread.html#interrupt()"><CODE>Thread.interrupt()</CODE></A></DL></DD></DL><HR><A NAME="tryLock()"><!-- --></A><H3>tryLock</H3><PRE>public boolean <B>tryLock</B>()</PRE><DL><DD>仅在调用时锁定未被另一个线程保持的情况下,才获取该锁定。<p>如果该锁定没有被另一个线程保持,并且立即返回 <tt>true</tt> 值,则将锁定的保持计数设置为 1。即使已将此锁定设置为使用公平排序策略,但是调用 <tt>tryLock()</tt> 仍<em>将</em> 立即获取锁定(如果有可用的),而不管其他线程当前是否正在等待该锁定。在某些情况下,此“闯入”行为可能很有用,即使它会打破公平性也如此。如果希望遵守此锁定的公平设置,则使用 <A HREF="ReentrantLock.html#tryLock(long, java.util.concurrent.TimeUnit)"><CODE>tryLock(0, TimeUnit.SECONDS) </CODE></A>,它几乎是等效的(也检测中断)。<p> 如果当前线程已经保持此锁定,则将保持计数加 1,该方法将返回 <tt>true</tt>。<p>如果锁定被另一个线程保持,则此方法将立即返回 <tt>false</tt> 值。<P><DD><DL><DT><B>指定者:</B><DD>接口 <CODE><A HREF="Lock.html" title="java.util.concurrent.locks 中的接口">Lock</A></CODE> 中的 <CODE><A HREF="Lock.html#tryLock()">tryLock</A></CODE></DL></DD><DD><DL><DT><B>返回:</B><DD>如果锁定是自由的并且被当前线程获取,或者当前线程已经保持该锁定,则返回 <tt>true</tt>;否则返回 <tt>false</tt>。</DL></DD></DL><HR><A NAME="tryLock(long, java.util.concurrent.TimeUnit)"><!-- --></A><H3>tryLock</H3><PRE>public boolean <B>tryLock</B>(long timeout, <A HREF="../TimeUnit.html" title="java.util.concurrent 中的枚举">TimeUnit</A> unit) throws <A HREF="../../../lang/InterruptedException.html" title="java.lang 中的类">InterruptedException</A></PRE><DL><DD>如果锁定在给定等待时间内没有被另一个线程保持,且当前线程未被<A HREF="../../../lang/Thread.html#interrupt()"><CODE>中断</CODE></A>,则获取该锁定。<p>如果该锁定没有被另一个线程保持,并且立即返回 <tt>true</tt> 值,则将锁定的保持计数设置为 1。如果为了使用公平的排序策略,已经设置此锁定,并且其他线程都在等待该锁定,则<em>不会</em> 获取一个可用的锁定。这与 <A HREF="ReentrantLock.html#tryLock()"><CODE>tryLock()</CODE></A> 方法相反。如果想使用一个允许闯入公平锁定的定时 <tt>tryLock</tt>,那么可以将定时形式和不定时形式组合在一起: <pre>if (lock.tryLock() || lock.tryLock(timeout, unit) ) { ... } </pre><p>如果当前线程已经保持此锁定,则将保持计数加 1,该方法将返回 <tt>true</tt>。<p>如果锁定被另一个线程保持,则出于线程调度目的,禁用当前线程,并且在发生以下三种情况之一以前,该线程将一直处于休眠状态: <ul><li>锁定由当前线程获得;或者<li>其他某个线程<A HREF="../../../lang/Thread.html#interrupt()"><CODE>中断</CODE></A> 当前线程;或者<li>已超过指定的等待时间 </ul><p>如果获得该锁定,则返回 <tt>true</tt> 值,并将锁定保持计数设置为 1。<p>如果当前线程: <ul><li>在进入此方法时已经设置了该线程的中断状态;或者<li>在等待获取锁定的同时被<A HREF="../../../lang/Thread.html#interrupt()"><CODE>中断</CODE></A>。 </ul>则抛出 <A HREF="../../../lang/InterruptedException.html" title="java.lang 中的类"><CODE>InterruptedException</CODE></A>,并且清除当前线程的已中断状态。 <p>如果超出了指定的等待时间,则返回值为 <tt>false</tt>。如果该时间小于或等于 0,则此方法根本不会等待。<p>在此实现中,因为此方法是一个显式中断点,所以要优先考虑响应中断,而不是响应锁定的普通获取或重入获取,或者报告所用的等待时间。<P><DD><DL><DT><B>指定者:</B><DD>接口 <CODE><A HREF="Lock.html" title="java.util.concurrent.locks 中的接口">Lock</A></CODE> 中的 <CODE><A HREF="Lock.html#tryLock(long, java.util.concurrent.TimeUnit)">tryLock</A></CODE></DL></DD><DD><DL><DT><B>参数:</B><DD><CODE>timeout</CODE> - 等待锁定的时间<DD><CODE>unit</CODE> - timeout 参数的时间单位<DT><B>返回:</B><DD>如果锁定是自由的并且由当前线程获取,或者当前线程已经保持该锁定,则返回 <tt>true</tt>;如果在获取该锁定之前已经到达等待时间,则返回 <tt>false</tt>。<DT><B>抛出:</B><DD><CODE><A HREF="../../../lang/InterruptedException.html" title="java.lang 中的类">InterruptedException</A></CODE> - 如果当前线程被中断<DD><CODE><A HREF="../../../lang/NullPointerException.html" title="java.lang 中的类">NullPointerException</A></CODE> - 如果单位为 null<DT><B>另请参见:</B><DD><A HREF="../../../lang/Thread.html#interrupt()"><CODE>Thread.interrupt()</CODE></A></DL></DD></DL><HR><A NAME="unlock()"><!-- --></A><H3>unlock</H3><PRE>public void <B>unlock</B>()</PRE><DL><DD>试图释放此锁定。 <p>如果当前线程是此锁定所有者,则将保持计数减 1。如果保持计数现在为 0,则释放该锁定。如果当前线程不是此锁定的持有者,则抛出 <A HREF="../../../lang/IllegalMonitorStateException.html" title="java.lang 中的类"><CODE>IllegalMonitorStateException</CODE></A>。<P><DD><DL><DT><B>指定者:</B><DD>接口 <CODE><A HREF="Lock.html" title="java.util.concurrent.locks 中的接口">Lock</A></CODE> 中的 <CODE><A HREF="Lock.html#unlock()">unlock</A></CODE></DL></DD><DD><DL><DT><B>抛出:</B><DD><CODE><A HREF="../../../lang/IllegalMonitorStateException.html" title="java.lang 中的类">IllegalMonitorStateException</A></CODE> - 如果当前线程没有保持此锁定。</DL></DD></DL><HR><A NAME="newCondition()"><!-- --></A><H3>newCondition</H3><PRE>public <A HREF="Condition.html" title="java.util.concurrent.locks 中的接口">Condition</A> <B>newCondition</B>()</PRE><DL><DD>返回用来与此 <A HREF="Lock.html" title="java.util.concurrent.locks 中的接口"><CODE>Lock</CODE></A> 实例一起使用的 <A HREF="Condition.html" title="java.util.concurrent.locks 中的接口"><CODE>Condition</CODE></A> 实例。<p>在使用内置监视器锁定时,返回的 <A HREF="Condition.html" title="java.util.concurrent.locks 中的接口"><CODE>Condition</CODE></A> 实例支持与 <A HREF="../../../lang/Object.html" title="java.lang 中的类"><CODE>Object</CODE></A> 的监视器方法(<A HREF="../../../lang/Object.html#wait()"><CODE>wait</CODE></A>、<A HREF="../../../lang/Object.html#notify()"><CODE>notify</CODE></A> 和 <A HREF="../../../lang/Object.html#notifyAll()"><CODE>notifyAll</CODE></A>)相同的用法。 <ul><li>在调用 <A HREF="Condition.html" title="java.util.concurrent.locks 中的接口"><CODE>Condition</CODE></A>、<A HREF="Condition.html#await()"><CODE>waiting</CODE></A> 或 <A HREF="Condition.html#signal()"><CODE>signalling</CODE></A> 这些方法中的任意一个方法时,如果没有保持此锁定,则将抛出 <A HREF="../../../lang/IllegalMonitorStateException.html" title="java.lang 中的类"><CODE>IllegalMonitorStateException</CODE></A>。<li>在调用 <A HREF="Condition.html#await()"><CODE>waiting</CODE></A> 条件方法时,将释放锁定,并在这些方法返回之前,重新获取该锁定,将锁定保持计数恢复为调用方法时所持有的值。<li>如果线程在等待时被中断,则等待将终止,并将抛出 <A HREF="../../../lang/InterruptedException.html" title="java.lang 中的类"><CODE>InterruptedException</CODE></A>,清除线程的中断状态。<li>等待线程按 FIFO 顺序收到信号<li>等待方法返回的线程重新获取锁定的顺序与线程最初获取锁定的顺序相同,在默认情况下,未指定此顺序,但对于<em>公平</em> 锁定,它们更倾向于那些等待时间最长的线程。 </ul><P><DD><DL><DT><B>指定者:</B><DD>接口 <CODE><A HREF="Lock.html" title="java.util.concurrent.locks 中的接口">Lock</A></CODE> 中的 <CODE><A HREF="Lock.html#newCondition()">newCondition</A></CODE></DL></DD><DD><DL><DT><B>返回:</B><DD>Condition 对象</DL></DD></DL><HR><A NAME="getHoldCount()"><!-- --></A><H3>getHoldCount</H3><PRE>public int <B>getHoldCount</B>()</PRE><DL><DD>查询当前线程保持此锁定的次数。<p>对于与解除锁定操作不匹配的每个锁定操作,线程都会保持一个锁定。<p>保持计数信息通常只用于测试和调试。例如,如果不应该使用已经保持的锁定进入代码的某一部分,则可以声明如下: <pre> class X { ReentrantLock lock = new ReentrantLock(); // ... public void m() { assert lock.getHoldCount() == 0; lock.lock(); try { // ... method body } finally { lock.unlock(); } } } </pre><P><DD><DL></DL></DD><DD><DL><DT><B>返回:</B><DD>当前线程保持此锁定的次数,如果此锁定未被当前线程保持过,则返回 0。</DL></DD></DL><HR><A NAME="isHeldByCurrentThread()"><!-- --></A><H3>isHeldByCurrentThread</H3><PRE>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?