﻿<?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-Tom Xu-随笔分类-java</title><link>http://www.blogjava.net/Tomshi-Xu/category/52962.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 05 Nov 2012 11:23:08 GMT</lastBuildDate><pubDate>Mon, 05 Nov 2012 11:23:08 GMT</pubDate><ttl>60</ttl><item><title>可重复性读写锁 显式锁 隐式锁 线程进程同步读写同步（ReentrantReadWriteLock  Lock Synchronized )</title><link>http://www.blogjava.net/Tomshi-Xu/archive/2012/11/04/390766.html</link><dc:creator>Tom Xu</dc:creator><author>Tom Xu</author><pubDate>Sun, 04 Nov 2012 14:37:00 GMT</pubDate><guid>http://www.blogjava.net/Tomshi-Xu/archive/2012/11/04/390766.html</guid><wfw:comment>http://www.blogjava.net/Tomshi-Xu/comments/390766.html</wfw:comment><comments>http://www.blogjava.net/Tomshi-Xu/archive/2012/11/04/390766.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Tomshi-Xu/comments/commentRss/390766.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Tomshi-Xu/services/trackbacks/390766.html</trackback:ping><description><![CDATA[<p style="widows: 2; text-transform: none; margin-top: 0pt; text-indent: 0px; letter-spacing: normal; font: 14px 微软雅黑; white-space: normal; orphans: 2; margin-bottom: 0pt; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="p0"><strong>ReentrantReadWriteLock的特性</strong></p>
<p style="widows: 2; text-transform: none; margin-top: 0pt; text-indent: 0px; letter-spacing: normal; font: 14px 微软雅黑; white-space: normal; orphans: 2; margin-bottom: 0pt; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="p0">1.公平性和非公平性获取锁：</p>
<p style="widows: 2; text-transform: none; margin-top: 0pt; text-indent: 0px; letter-spacing: normal; font: 14px 微软雅黑; white-space: normal; orphans: 2; margin-bottom: 0pt; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="p0">&nbsp;&nbsp;&nbsp;&nbsp;支持按照公平的原则获取锁，即读写线程按照最长等待时间分配锁</p>
<p style="widows: 2; text-transform: none; margin-top: 0pt; text-indent: 0px; letter-spacing: normal; font: 14px 微软雅黑; white-space: normal; orphans: 2; margin-bottom: 0pt; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="p0">&nbsp;&nbsp;&nbsp;&nbsp;若构造为非公平性的，则按照先到先得的顺序，但是有读线程想获取锁时，该顺序被打破</p>
<p style="widows: 2; text-transform: none; margin-top: 0pt; text-indent: 0px; letter-spacing: normal; font: 14px 微软雅黑; white-space: normal; orphans: 2; margin-bottom: 0pt; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="p0">2.重复获得锁：读线程可以重复的获取锁，尽管当前读线程占用</p>
<p style="widows: 2; text-transform: none; margin-top: 0pt; text-indent: 0px; letter-spacing: normal; font: 14px 微软雅黑; white-space: normal; orphans: 2; margin-bottom: 0pt; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="p0">3.锁降级：</p>
<p style="widows: 2; text-transform: none; margin-top: 0pt; text-indent: 0px; letter-spacing: normal; font: 14px 微软雅黑; white-space: normal; orphans: 2; margin-bottom: 0pt; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="p0">&nbsp; &nbsp; 可以将write lock 的等级降为 read lock ,顺序是：先获得WriteLock再获得ReadLock，然后释放WriteLock，这时候线程将保持Readlock的持 有。</p>
<p style="widows: 2; text-transform: none; margin-top: 0pt; text-indent: 0px; letter-spacing: normal; font: 14px 微软雅黑; white-space: normal; orphans: 2; margin-bottom: 0pt; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="p0">&nbsp; &nbsp;反过来ReadLock想要升级为WriteLock则不可能</p>
<p style="widows: 2; text-transform: none; margin-top: 0pt; text-indent: 0px; letter-spacing: normal; font: 14px 微软雅黑; white-space: normal; orphans: 2; margin-bottom: 0pt; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="p0">4.中断锁的获取：读锁和写锁的获取期间都允许被中断</p>
<p style="widows: 2; text-transform: none; margin-top: 0pt; text-indent: 0px; letter-spacing: normal; font: 14px 微软雅黑; white-space: normal; orphans: 2; margin-bottom: 0pt; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="p0">5.Condition 类的支持：该支持仅仅就写操作而言，若readLock(0.newCondition() 将会throws UnsupprotedoperationException</p>
<p style="widows: 2; text-transform: none; margin-top: 0pt; text-indent: 0px; letter-spacing: normal; font: 14px 微软雅黑; white-space: normal; orphans: 2; margin-bottom: 0pt; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="p0">6.可监测性：这个类支持操作是否对锁的获取还是竞争，只是为检测系统状态，而不是为了同步而设计的。</p>
<p style="widows: 2; text-transform: none; margin-top: 0pt; text-indent: 0px; letter-spacing: normal; font: 14px 微软雅黑; white-space: normal; orphans: 2; margin-bottom: 0pt; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="p0"><br /></p>
<p style="widows: 2; text-transform: none; margin-top: 0pt; text-indent: 0px; letter-spacing: normal; font: 14px 微软雅黑; white-space: normal; orphans: 2; margin-bottom: 0pt; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="p0"><strong>显式锁（Lock）和隐式锁(Synchronized)的不同点，括号注明隐式锁与重复读写锁（ReentrantReadWriteLock）的区别</strong></p>
<p style="widows: 2; text-transform: none; margin-top: 0pt; text-indent: 0px; letter-spacing: normal; font: 14px 微软雅黑; white-space: normal; orphans: 2; margin-bottom: 0pt; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="p0">1.不能主动中断正在试图获得锁的线程 &nbsp;（显式写操作锁可以主动的挂起读操作锁，进行写操作）</p>
<p style="widows: 2; text-transform: none; margin-top: 0pt; text-indent: 0px; letter-spacing: normal; font: 14px 微软雅黑; white-space: normal; orphans: 2; margin-bottom: 0pt; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="p0">2.试图获得锁时不能设置超时</p>
<p style="widows: 2; text-transform: none; margin-top: 0pt; text-indent: 0px; letter-spacing: normal; font: 14px 微软雅黑; white-space: normal; orphans: 2; margin-bottom: 0pt; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="p0">3.在对象内部锁只有一个并且内部锁只有一个单一的条件，可能不够用(显示锁可以有多个，不断重复的对读写操作加锁)</p>
<p style="widows: 2; text-transform: none; margin-top: 0pt; text-indent: 0px; letter-spacing: normal; font: 14px 微软雅黑; white-space: normal; orphans: 2; margin-bottom: 0pt; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="p0"><br /></p>
<p style="widows: 2; text-transform: none; margin-top: 0pt; text-indent: 0px; letter-spacing: normal; font: 14px 微软雅黑; white-space: normal; orphans: 2; margin-bottom: 0pt; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="p0"><strong>对ReentrantReadWriteLock类测试</strong></p>
<p style="widows: 2; text-transform: none; margin-top: 0pt; text-indent: 0px; letter-spacing: normal; font: 14px 微软雅黑; white-space: normal; orphans: 2; margin-bottom: 0pt; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="p0">&nbsp; &nbsp;1.读/写操作的锁多线程测试 : 单独的读操作和写操作何以完成读或写的同步</p>
<p style="widows: 2; text-transform: none; margin-top: 0pt; text-indent: 0px; letter-spacing: normal; font: 14px 微软雅黑; white-space: normal; orphans: 2; margin-bottom: 0pt; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="p0">&nbsp; &nbsp;2.读操作所和写操作锁多线程测试 : &nbsp;能同步 (必需操作类中将 ReentrantReadWriteLock声明为static的成员变量)</p>
<p style="widows: 2; text-transform: none; margin-top: 0pt; text-indent: 0px; letter-spacing: normal; font: 14px 微软雅黑; white-space: normal; orphans: 2; margin-bottom: 0pt; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="p0">&nbsp; &nbsp;3.读操作进程和写操作进程间测试：不支持进程间的同步</p><img src ="http://www.blogjava.net/Tomshi-Xu/aggbug/390766.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Tomshi-Xu/" target="_blank">Tom Xu</a> 2012-11-04 22:37 <a href="http://www.blogjava.net/Tomshi-Xu/archive/2012/11/04/390766.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>