reentrantreadwritelock.html
来自「j2se5-api-zh,java文档的中文版本」· HTML 代码 · 共 839 行 · 第 1/3 页
HTML
839 行
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><!--NewPage--><HTML><HEAD><!-- Generated by javadoc (build 1.5.0_03) on Wed Nov 02 09:52:00 CST 2005 --><META http-equiv="Content-Type" content="text/html; charset=gb2312"><TITLE>ReentrantReadWriteLock (Java 2 Platform SE 5.0)</TITLE><META NAME="keywords" CONTENT="java.util.concurrent.locks.ReentrantReadWriteLock class"><LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style"><SCRIPT type="text/javascript">function windowTitle(){ parent.document.title="ReentrantReadWriteLock (Java 2 Platform SE 5.0)";}</SCRIPT><NOSCRIPT></NOSCRIPT></HEAD><BODY BGCOLOR="white" onload="windowTitle();"><!-- ========= START OF TOP NAVBAR ======= --><A NAME="navbar_top"><!-- --></A><A HREF="#skip-navbar_top" title="跳过导航链接"></A><TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""><TR><TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"><A NAME="navbar_top_firstrow"><!-- --></A><TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY=""> <TR ALIGN="center" VALIGN="top"> <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>概述</B></FONT></A> </TD> <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>软件包</B></FONT></A> </TD> <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>类</B></FONT> </TD> <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="class-use/ReentrantReadWriteLock.html"><FONT CLASS="NavBarFont1"><B>使用</B></FONT></A> </TD> <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>树</B></FONT></A> </TD> <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>已过时</B></FONT></A> </TD> <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-files/index-1.html"><FONT CLASS="NavBarFont1"><B>索引</B></FONT></A> </TD> <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>帮助</B></FONT></A> </TD> </TR></TABLE></TD><TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM><b>Java<sup><font size=-2>TM</font></sup> 2 Platform<br>Standard Ed. 5.0</b></EM></TD></TR><TR><TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <A HREF="ReentrantLock.html" title="java.util.concurrent.locks 中的类"><B>上一个类</B></A> <A HREF="ReentrantReadWriteLock.ReadLock.html" title="java.util.concurrent.locks 中的类"><B>下一个类</B></A></FONT></TD><TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <A HREF="../../../../index.html@java_2Futil_2Fconcurrent_2Flocks_2FReentrantReadWriteLock.html" target="_top"><B>框架</B></A> <A HREF="ReentrantReadWriteLock.html" target="_top"><B>无框架</B></A> <SCRIPT type="text/javascript"> <!-- if(window==top) { document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>所有类</B></A>'); } //--></SCRIPT><NOSCRIPT> <A HREF="../../../../allclasses-noframe.html"><B>所有类</B></A></NOSCRIPT></FONT></TD></TR><TR><TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2"> 摘要: <A HREF="#nested_class_summary">嵌套</A> | 字段 | <A HREF="#constructor_summary">构造方法</A> | <A HREF="#method_summary">方法</A></FONT></TD><TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">详细信息: 字段 | <A HREF="#constructor_detail">构造方法</A> | <A HREF="#method_detail">方法</A></FONT></TD></TR></TABLE><A NAME="skip-navbar_top"></A><!-- ========= END OF TOP NAVBAR ========= --><HR><!-- ======== START OF CLASS DATA ======== --><H2><FONT SIZE="-1">java.util.concurrent.locks</FONT><BR>类 ReentrantReadWriteLock</H2><PRE><A HREF="../../../lang/Object.html" title="java.lang 中的类">java.lang.Object</A> <IMG SRC="../../../../resources/inherit.gif" ALT="继承者 "><B>java.util.concurrent.locks.ReentrantReadWriteLock</B></PRE><DL><DT><B>所有已实现的接口:</B> <DD>java.io.Serializable, <A HREF="ReadWriteLock.html" title="java.util.concurrent.locks 中的接口">ReadWriteLock</A></DD></DL><HR><DL><DT><PRE>public class <B>ReentrantReadWriteLock</B><DT>extends <A HREF="../../../lang/Object.html" title="java.lang 中的类">Object</A><DT>implements <A HREF="ReadWriteLock.html" title="java.util.concurrent.locks 中的接口">ReadWriteLock</A>, java.io.Serializable</DL></PRE><P>支持与 <A HREF="ReentrantLock.html" title="java.util.concurrent.locks 中的类"><CODE>ReentrantLock</CODE></A> 类似语义的 <A HREF="ReadWriteLock.html" title="java.util.concurrent.locks 中的接口"><CODE>ReadWriteLock</CODE></A> 实现。<p>此类具有以下属性: <ul><li><b>获取顺序</b><p> 此类不会将读取者优先或写入者优先强加给锁定访问的排序。但是,它确实支持可选的<em>公平</em> 策略。当公平地构造线程时,线程利用一个近似到达顺序的策略来争夺进入。当释放写入锁定后,将写入锁定分配给等待时间最长的单个写入者,或者如果有一个等待时间比所有写入者更长的读取者,则将读取锁定分配给读取者 set。当非公平地构造线程时,则不需要按照到达顺序进入锁定。不管是哪一种情况,如果读取者处于活动状态,而某个写入者进入锁定状态,那么在获取写入者并释放写入锁定之前,不会将读取锁定授予任何后续的读取者。 <li><b>重入</b><p>此锁定允许读取者和写入者按照 <A HREF="ReentrantLock.html" title="java.util.concurrent.locks 中的类"><CODE>ReentrantLock</CODE></A> 的样式重新获取读取锁定或写入锁定。在写入线程保持的所有写入锁定都已经释放后,才允许写入者使用它们。 <p>此外,写入者可以获取读取锁定——但反过来则不成立。在其他应用程序中,当在调用或回调那些在读取锁定状态下执行读取操作的方法期间保持写入锁定时,重入很有用。如果读取者试图获取写入锁定,那么将永远不会获得成功。 <li><b>锁定降级</b><p>重入还允许从写入锁定降级为读取锁定,其实现方式是:先获取写入锁定,然后获取读取锁定,最后释放写入锁定。但是,从读取锁定升级到写入锁定是<b>不可能的</b>。<li><b>锁定获取的中断</b><p>读取锁定和写入锁定都支持锁定获取期间的中断。<li><b><A HREF="Condition.html" title="java.util.concurrent.locks 中的接口"><CODE>Condition</CODE></A> 支持</b><p>写入锁定提供了一个 <A HREF="Condition.html" title="java.util.concurrent.locks 中的接口"><CODE>Condition</CODE></A> 实现,对于写入锁定来说,该实现的行为与 <A HREF="ReentrantLock.html#newCondition()"><CODE>ReentrantLock.newCondition()</CODE></A> 提供的 <A HREF="Condition.html" title="java.util.concurrent.locks 中的接口"><CODE>Condition</CODE></A> 实现对 <A HREF="ReentrantLock.html" title="java.util.concurrent.locks 中的类"><CODE>ReentrantLock</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>,<tt>readLock().newCondition()</tt> 会抛出 <tt>UnsupportedOperationException</tt>。<li><b>监测</b><P> 此类支持一些确定是保持锁定还是争用锁定的方法。这些方法设计用于监视系统状态,而不是同步控制。 </ul><p> 此类行为的序列化方式与内置锁定的相同:反序列化的锁定处于解除锁定状态,无论序列化该锁定时其状态如何。<p><b>示例用法</b>。下面的代码展示了如何利用重入来执行升级缓存后的锁定降级(为简单起见,省略了异常处理): <pre> class CachedData { Object data; volatile boolean cacheValid; ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); void processCachedData() { rwl.readLock().lock(); if (!cacheValid) { // upgrade lock manually rwl.readLock().unlock(); // must unlock first to obtain writelock rwl.writeLock().lock(); if (!cacheValid) { // recheck data = ... cacheValid = true; } // downgrade lock rwl.readLock().lock(); // reacquire read without giving up write lock rwl.writeLock().unlock(); // unlock write, still hold read } use(data); rwl.readLock().unlock(); } } </pre>在使用某些种类的 Collection 时,可以使用 ReentrantReadWriteLock 来提高并发性。通常,在预期 collection 很大,读取者线程访问它的次数多于写入者线程,并且 entail 操作的开销高于同步开销时,这很值得一试。例如,以下是一个使用 TreeMap 的类,预期它很大,并且能被同时访问。 <pre> class RWDictionary { private final Map<String, Data> m = new TreeMap<String, Data>(); private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); private final Lock r = rwl.readLock(); private final Lock w = rwl.writeLock(); public Data get(String key) { r.lock(); try { return m.get(key); } finally { r.unlock(); } } public String[] allKeys() { r.lock(); try { return m.keySet().toArray(); } finally { r.unlock(); } } public Data put(String key, Data value) { w.lock(); try { return m.put(key, value); } finally { w.unlock(); } } public void clear() { w.lock(); try { m.clear(); } finally { w.unlock(); } } } </pre> <h3>实现注意事项:</h3><p>重入写入锁定定义了一个所有者,但只有获取它的线程才能将它释放。相反,在此实现中,读取锁定没有所有权这一概念,并不要求释放读取锁定的线程与获取该锁定的线程是同一线程。但是,无法保证此类以后的实现中会保持此属性。<p>此锁定最多支持 65536 个递归写入锁定和 65536 个读取锁定。试图超出这些限制将导致锁定方法抛出 <A HREF="../../../lang/Error.html" title="java.lang 中的类"><CODE>Error</CODE></A>。<P><P><DL><DT><B>从以下版本开始:</B></DT> <DD>1.5</DD><DT><B>另请参见:</B><DD><A HREF="../../../../serialized-form.html#java.util.concurrent.locks.ReentrantReadWriteLock">序列化表格</A></DL><HR><P><!-- ======== NESTED CLASS SUMMARY ======== --><A NAME="nested_class_summary"><!-- --></A><TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""><TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"><TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2"><B>嵌套类摘要</B></FONT></TH></TR><TR BGCOLOR="white" CLASS="TableRowColor"><TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"><CODE>static class</CODE></FONT></TD><TD><CODE><B><A HREF="ReentrantReadWriteLock.ReadLock.html" title="java.util.concurrent.locks 中的类">ReentrantReadWriteLock.ReadLock</A></B></CODE><BR> <A HREF="ReentrantReadWriteLock.html#readLock()"><CODE>readLock()</CODE></A> 方法返回的锁定。</TD></TR><TR BGCOLOR="white" CLASS="TableRowColor"><TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"><CODE>static class</CODE></FONT></TD><TD><CODE><B><A HREF="ReentrantReadWriteLock.WriteLock.html" title="java.util.concurrent.locks 中的类">ReentrantReadWriteLock.WriteLock</A></B></CODE><BR> <A HREF="ReentrantReadWriteLock.html#writeLock()"><CODE>writeLock()</CODE></A> 方法返回的锁定。</TD></TR></TABLE> <!-- ======== CONSTRUCTOR SUMMARY ======== --><A NAME="constructor_summary"><!-- --></A><TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""><TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"><TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2"><B>构造方法摘要</B></FONT></TH></TR><TR BGCOLOR="white" CLASS="TableRowColor"><TD><CODE><B><A HREF="ReentrantReadWriteLock.html#ReentrantReadWriteLock()">ReentrantReadWriteLock</A></B>()</CODE><BR> 使用默认的排序属性创建一个新的 <tt>ReentrantReadWriteLock</tt>。</TD></TR><TR BGCOLOR="white" CLASS="TableRowColor"><TD><CODE><B><A HREF="ReentrantReadWriteLock.html#ReentrantReadWriteLock(boolean)">ReentrantReadWriteLock</A></B>(boolean fair)</CODE><BR> 使用给定的公平策略创建一个新的 <tt>ReentrantReadWriteLock</tt>。</TD></TR></TABLE> <!-- ========== METHOD SUMMARY =========== --><A NAME="method_summary"><!-- --></A><TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""><TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"><TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2"><B>方法摘要</B></FONT></TH></TR><TR BGCOLOR="white" CLASS="TableRowColor"><TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"><CODE>protected <A HREF="../../../lang/Thread.html" title="java.lang 中的类">Thread</A></CODE></FONT></TD><TD><CODE><B><A HREF="ReentrantReadWriteLock.html#getOwner()">getOwner</A></B>()</CODE><BR> 返回当前拥有写入锁定的线程,如果没有这样的线程,则返回 <tt>null</tt>。</TD></TR><TR BGCOLOR="white" CLASS="TableRowColor"><TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"><CODE>protected <A HREF="../../Collection.html" title="java.util 中的接口">Collection</A><<A HREF="../../../lang/Thread.html" title="java.lang 中的类">Thread</A>></CODE></FONT></TD><TD><CODE><B><A HREF="ReentrantReadWriteLock.html#getQueuedReaderThreads()">getQueuedReaderThreads</A></B>()</CODE><BR> 返回一个 collection,它包含可能正在等待获取读取锁定的线程。</TD></TR><TR BGCOLOR="white" CLASS="TableRowColor"><TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"><CODE>protected <A HREF="../../Collection.html" title="java.util 中的接口">Collection</A><<A HREF="../../../lang/Thread.html" title="java.lang 中的类">Thread</A>></CODE></FONT></TD><TD><CODE><B><A HREF="ReentrantReadWriteLock.html#getQueuedThreads()">getQueuedThreads</A></B>()</CODE><BR> 返回一个 collection,它包含可能正在等待获取读取或写入锁定的线程。</TD></TR>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?