This commit is contained in:
chai2010
2016-01-02 16:04:45 +08:00
parent 7fd791b51a
commit 796c2eea51
126 changed files with 3484 additions and 2032 deletions

View File

@@ -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&#x8B80;&#x5BEB;&#x9396;">9.3. sync.RWMutex&#x8B80;&#x5BEB;&#x9396;</h2>
<p>TODO</p>
<p>&#x5728;100&#x5200;&#x7684;&#x5B58;&#x6B3E;&#x6D88;&#x5931;&#x65F6;&#x4E0D;&#x505A;&#x8BB0;&#x5F55;&#x591A;&#x5C11;&#x8FD8;&#x662F;&#x4F1A;&#x8BA9;&#x6211;&#x4EEC;&#x6709;&#x4E00;&#x4E9B;&#x6050;&#x614C;&#xFF0C;Bob&#x5199;&#x4E86;&#x4E00;&#x4E2A;&#x7A0B;&#x5E8F;&#xFF0C;&#x6BCF;&#x79D2;&#x8FD0;&#x884C;&#x51E0;&#x767E;&#x6B21;&#x6765;&#x68C0;&#x67E5;&#x4ED6;&#x7684;&#x94F6;&#x884C;&#x4F59;&#x989D;&#x3002;&#x4ED6;&#x4F1A;&#x5728;&#x5BB6;&#xFF0C;&#x5728;&#x5DE5;&#x4F5C;&#x4E2D;&#xFF0C;&#x751A;&#x81F3;&#x4F1A;&#x5728;&#x4ED6;&#x7684;&#x624B;&#x673A;&#x4E0A;&#x6765;&#x8FD0;&#x884C;&#x8FD9;&#x4E2A;&#x7A0B;&#x5E8F;&#x3002;&#x94F6;&#x884C;&#x6CE8;&#x610F;&#x5230;&#x8FD9;&#x4E9B;&#x9661;&#x589E;&#x7684;&#x6D41;&#x91CF;&#x4F7F;&#x5F97;&#x5B58;&#x6B3E;&#x548C;&#x53D6;&#x6B3E;&#x6709;&#x4E86;&#x5EF6;&#x65F6;&#xFF0C;&#x56E0;&#x4E3A;&#x6240;&#x6709;&#x7684;&#x4F59;&#x989D;&#x67E5;&#x8BE2;&#x8BF7;&#x6C42;&#x662F;&#x987A;&#x5E8F;&#x6267;&#x884C;&#x7684;&#xFF0C;&#x8FD9;&#x6837;&#x4F1A;&#x4E92;&#x65A5;&#x5730;&#x83B7;&#x5F97;&#x9501;&#xFF0C;&#x5E76;&#x4E14;&#x4F1A;&#x6682;&#x65F6;&#x963B;&#x6B62;&#x5176;&#x5B83;&#x7684;goroutine&#x8FD0;&#x884C;&#x3002;</p>
<p>&#x7531;&#x4E8E;Balance&#x51FD;&#x6570;&#x53EA;&#x9700;&#x8981;&#x8BFB;&#x53D6;&#x53D8;&#x91CF;&#x7684;&#x72B6;&#x6001;&#xFF0C;&#x6240;&#x4EE5;&#x6211;&#x4EEC;&#x540C;&#x65F6;&#x8BA9;&#x591A;&#x4E2A;Balance&#x8C03;&#x7528;&#x5E76;&#x53D1;&#x8FD0;&#x884C;&#x4E8B;&#x5B9E;&#x4E0A;&#x662F;&#x5B89;&#x5168;&#x7684;&#xFF0C;&#x53EA;&#x8981;&#x5728;&#x8FD0;&#x884C;&#x7684;&#x65F6;&#x5019;&#x6CA1;&#x6709;&#x5B58;&#x6B3E;&#x6216;&#x8005;&#x53D6;&#x6B3E;&#x64CD;&#x4F5C;&#x5C31;&#x884C;&#x3002;&#x5728;&#x8FD9;&#x79CD;&#x573A;&#x666F;&#x4E0B;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x4E00;&#x79CD;&#x7279;&#x6B8A;&#x7C7B;&#x578B;&#x7684;&#x9501;&#xFF0C;&#x5176;&#x5141;&#x8BB8;&#x591A;&#x4E2A;&#x53EA;&#x8BFB;&#x64CD;&#x4F5C;&#x5E76;&#x884C;&#x6267;&#x884C;&#xFF0C;&#x4F46;&#x5199;&#x64CD;&#x4F5C;&#x4F1A;&#x5B8C;&#x5168;&#x4E92;&#x65A5;&#x3002;&#x8FD9;&#x79CD;&#x9501;&#x53EB;&#x4F5C;&#x201C;&#x591A;&#x8BFB;&#x5355;&#x5199;&#x201D;&#x9501;(multiple readers, single writer lock)&#xFF0C;Go&#x8BED;&#x8A00;&#x63D0;&#x4F9B;&#x7684;&#x8FD9;&#x6837;&#x7684;&#x9501;&#x662F;sync.RWMutex&#xFF1A;</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&#x51FD;&#x6570;&#x73B0;&#x5728;&#x8C03;&#x7528;&#x4E86;RLock&#x548C;RUnlock&#x65B9;&#x6CD5;&#x6765;&#x83B7;&#x53D6;&#x548C;&#x91CA;&#x653E;&#x4E00;&#x4E2A;&#x8BFB;&#x53D6;&#x6216;&#x8005;&#x5171;&#x4EAB;&#x9501;&#x3002;Deposit&#x51FD;&#x6570;&#x6CA1;&#x6709;&#x53D8;&#x5316;&#xFF0C;&#x4F1A;&#x8C03;&#x7528;mu.Lock&#x548C;mu.Unlock&#x65B9;&#x6CD5;&#x6765;&#x83B7;&#x53D6;&#x548C;&#x91CA;&#x653E;&#x4E00;&#x4E2A;&#x5199;&#x6216;&#x4E92;&#x65A5;&#x9501;&#x3002;</p>
<p>&#x5728;&#x8FD9;&#x6B21;&#x4FEE;&#x6539;&#x540E;&#xFF0C;Bob&#x7684;&#x4F59;&#x989D;&#x67E5;&#x8BE2;&#x8BF7;&#x6C42;&#x5C31;&#x53EF;&#x4EE5;&#x5F7C;&#x6B64;&#x5E76;&#x884C;&#x5730;&#x6267;&#x884C;&#x5E76;&#x4E14;&#x4F1A;&#x5F88;&#x5FEB;&#x5730;&#x5B8C;&#x6210;&#x4E86;&#x3002;&#x9501;&#x5728;&#x66F4;&#x591A;&#x7684;&#x65F6;&#x95F4;&#x8303;&#x56F4;&#x53EF;&#x7528;&#xFF0C;&#x5E76;&#x4E14;&#x5B58;&#x6B3E;&#x8BF7;&#x6C42;&#x4E5F;&#x80FD;&#x591F;&#x53CA;&#x65F6;&#x5730;&#x88AB;&#x54CD;&#x5E94;&#x4E86;&#x3002;</p>
<p>RLock&#x53EA;&#x80FD;&#x5728;&#x4E34;&#x754C;&#x533A;&#x5171;&#x4EAB;&#x53D8;&#x91CF;&#x6CA1;&#x6709;&#x4EFB;&#x4F55;&#x5199;&#x5165;&#x64CD;&#x4F5C;&#x65F6;&#x53EF;&#x7528;&#x3002;&#x4E00;&#x822C;&#x6765;&#x8BF4;&#xFF0C;&#x6211;&#x4EEC;&#x4E0D;&#x5E94;&#x8BE5;&#x5047;&#x8BBE;&#x903B;&#x8F91;&#x4E0A;&#x7684;&#x53EA;&#x8BFB;&#x51FD;&#x6570;/&#x65B9;&#x6CD5;&#x4E5F;&#x4E0D;&#x4F1A;&#x53BB;&#x66F4;&#x65B0;&#x67D0;&#x4E00;&#x4E9B;&#x53D8;&#x91CF;&#x3002;&#x6BD4;&#x5982;&#x4E00;&#x4E2A;&#x65B9;&#x6CD5;&#x529F;&#x80FD;&#x662F;&#x8BBF;&#x95EE;&#x4E00;&#x4E2A;&#x53D8;&#x91CF;&#xFF0C;&#x4F46;&#x5B83;&#x4E5F;&#x6709;&#x53EF;&#x80FD;&#x4F1A;&#x540C;&#x65F6;&#x53BB;&#x7ED9;&#x4E00;&#x4E2A;&#x5185;&#x90E8;&#x7684;&#x8BA1;&#x6570;&#x5668;+1(&#x8BD1;&#x6CE8;&#xFF1A;&#x53EF;&#x80FD;&#x662F;&#x8BB0;&#x5F55;&#x8FD9;&#x4E2A;&#x65B9;&#x6CD5;&#x7684;&#x8BBF;&#x95EE;&#x6B21;&#x6570;&#x5565;&#x7684;)&#xFF0C;&#x6216;&#x8005;&#x53BB;&#x66F4;&#x65B0;&#x7F13;&#x5B58;--&#x4F7F;&#x5373;&#x65F6;&#x7684;&#x8C03;&#x7528;&#x80FD;&#x591F;&#x66F4;&#x5FEB;&#x3002;&#x5982;&#x679C;&#x6709;&#x7591;&#x60D1;&#x7684;&#x8BDD;&#xFF0C;&#x8BF7;&#x4F7F;&#x7528;&#x4E92;&#x65A5;&#x9501;&#x3002;</p>
<p>RWMutex&#x53EA;&#x6709;&#x5F53;&#x83B7;&#x5F97;&#x9501;&#x7684;&#x5927;&#x90E8;&#x5206;goroutine&#x90FD;&#x662F;&#x8BFB;&#x64CD;&#x4F5C;&#xFF0C;&#x800C;&#x9501;&#x5728;&#x7ADE;&#x4E89;&#x6761;&#x4EF6;&#x4E0B;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#xFF0C;goroutine&#x4EEC;&#x5FC5;&#x987B;&#x7B49;&#x5F85;&#x624D;&#x80FD;&#x83B7;&#x53D6;&#x5230;&#x9501;&#x7684;&#x65F6;&#x5019;&#xFF0C;RWMutex&#x624D;&#x662F;&#x6700;&#x80FD;&#x5E26;&#x6765;&#x597D;&#x5904;&#x7684;&#x3002;RWMutex&#x9700;&#x8981;&#x66F4;&#x590D;&#x6742;&#x7684;&#x5185;&#x90E8;&#x8BB0;&#x5F55;&#xFF0C;&#x6240;&#x4EE5;&#x4F1A;&#x8BA9;&#x5B83;&#x6BD4;&#x4E00;&#x822C;&#x7684;&#x65E0;&#x7ADE;&#x4E89;&#x9501;&#x7684;mutex&#x6162;&#x4E00;&#x4E9B;&#x3002;</p>
</section>