mirror of
https://github.com/gopl-zh/gopl-zh.github.com.git
synced 2025-12-20 12:44:20 +08:00
rebuild
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
<title>sync.RWMutex讀寫鎖 | Go语言圣经</title>
|
||||
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
|
||||
<meta name="description" content="">
|
||||
<meta name="generator" content="GitBook 2.5.2">
|
||||
<meta name="generator" content="GitBook 2.6.6">
|
||||
|
||||
|
||||
<meta name="HandheldFriendly" content="true"/>
|
||||
@@ -48,7 +48,13 @@
|
||||
<body>
|
||||
|
||||
|
||||
<div class="book" data-level="9.3" data-chapter-title="sync.RWMutex讀寫鎖" data-filepath="ch9/ch9-03.md" data-basepath=".." data-revision="Thu Dec 31 2015 16:18:40 GMT+0800 (中国标准时间)">
|
||||
<div class="book"
|
||||
data-level="9.3"
|
||||
data-chapter-title="sync.RWMutex讀寫鎖"
|
||||
data-filepath="ch9/ch9-03.md"
|
||||
data-basepath=".."
|
||||
data-revision="Sat Jan 02 2016 16:00:23 GMT+0800 (中国标准时间)"
|
||||
data-innerlanguage="">
|
||||
|
||||
|
||||
<div class="book-summary">
|
||||
@@ -2024,7 +2030,20 @@
|
||||
<section class="normal" id="section-">
|
||||
|
||||
<h2 id="93-syncrwmutex讀寫鎖">9.3. sync.RWMutex讀寫鎖</h2>
|
||||
<p>TODO</p>
|
||||
<p>在100刀的存款消失时不做记录多少还是会让我们有一些恐慌,Bob写了一个程序,每秒运行几百次来检查他的银行余额。他会在家,在工作中,甚至会在他的手机上来运行这个程序。银行注意到这些陡增的流量使得存款和取款有了延时,因为所有的余额查询请求是顺序执行的,这样会互斥地获得锁,并且会暂时阻止其它的goroutine运行。</p>
|
||||
<p>由于Balance函数只需要读取变量的状态,所以我们同时让多个Balance调用并发运行事实上是安全的,只要在运行的时候没有存款或者取款操作就行。在这种场景下我们需要一种特殊类型的锁,其允许多个只读操作并行执行,但写操作会完全互斥。这种锁叫作“多读单写”锁(multiple readers, single writer lock),Go语言提供的这样的锁是sync.RWMutex:</p>
|
||||
<pre><code class="lang-go"><span class="hljs-keyword">var</span> mu sync.RWMutex
|
||||
<span class="hljs-keyword">var</span> balance <span class="hljs-typename">int</span>
|
||||
<span class="hljs-keyword">func</span> Balance() <span class="hljs-typename">int</span> {
|
||||
mu.RLock() <span class="hljs-comment">// readers lock</span>
|
||||
<span class="hljs-keyword">defer</span> mu.RUnlock()
|
||||
<span class="hljs-keyword">return</span> balance
|
||||
}
|
||||
</code></pre>
|
||||
<p>Balance函数现在调用了RLock和RUnlock方法来获取和释放一个读取或者共享锁。Deposit函数没有变化,会调用mu.Lock和mu.Unlock方法来获取和释放一个写或互斥锁。</p>
|
||||
<p>在这次修改后,Bob的余额查询请求就可以彼此并行地执行并且会很快地完成了。锁在更多的时间范围可用,并且存款请求也能够及时地被响应了。</p>
|
||||
<p>RLock只能在临界区共享变量没有任何写入操作时可用。一般来说,我们不应该假设逻辑上的只读函数/方法也不会去更新某一些变量。比如一个方法功能是访问一个变量,但它也有可能会同时去给一个内部的计数器+1(译注:可能是记录这个方法的访问次数啥的),或者去更新缓存--使即时的调用能够更快。如果有疑惑的话,请使用互斥锁。</p>
|
||||
<p>RWMutex只有当获得锁的大部分goroutine都是读操作,而锁在竞争条件下,也就是说,goroutine们必须等待才能获取到锁的时候,RWMutex才是最能带来好处的。RWMutex需要更复杂的内部记录,所以会让它比一般的无竞争锁的mutex慢一些。</p>
|
||||
|
||||
|
||||
</section>
|
||||
|
||||
Reference in New Issue
Block a user