make loop

This commit is contained in:
chai2010
2016-01-02 20:56:29 +08:00
parent 886f8657ec
commit 4c508171ec

View File

@@ -1,8 +1,8 @@
## 9.3. sync.RWMutex讀寫鎖
在100刀的存款消失不做记录多少还是会让我们有一些恐慌Bob了一程序,每秒运行几百次来检查他的银行余额。他在家,在工作中,甚至在他的手机上来运行这个程序。银行注意到些陡增的流量使得存款和取款有了延,因所有的余额查询请求是顺序执行的,这样会互斥地获得锁,并且会暂时阻止其它的goroutine行。
在100刀的存款消失不做記録多少還是會讓我們有一些恐慌Bob了一程序,每秒運行幾百次來檢査他的銀行餘額。他在家,在工作中,甚至在他的手機上來運行這個程序。銀行註意到些陡增的流量使得存款和取款有了延,因所有的餘額査詢請求是順序執行的,這樣會互斥地獲得鎖,併且會暫時阻止其它的goroutine行。
Balance函数只需要读取变量的状态,所以我们同时让多个Balance调用并发运行事上是安全的,要在行的时候没有存款或者取款操作就行。在这种场景下我需要一特殊型的,其允许多个只读操作并行执行,但操作完全互斥。这种锁叫作“多读单写”锁(multiple readers, single writer lock)Go言提供的这样的锁是sync.RWMutex
Balance函數隻需要讀取變量的狀態,所以我們同時讓多個Balance調用併發運行事上是安全的,要在行的時候沒有存款或者取款操作就行。在這種場景下我需要一特殊型的,其允許多個隻讀操作併行執行,但操作完全互斥。這種鎖叫作“多讀單寫”鎖(multiple readers, single writer lock)Go言提供的這樣的鎖是sync.RWMutex
```go
var mu sync.RWMutex
@@ -14,11 +14,11 @@ func Balance() int {
}
```
Balance函数现在调用了RLock和RUnlock方法来获取和放一个读取或者共享。Deposit函数没有变化,会调用mu.Lock和mu.Unlock方法来获取和放一个写或互斥
Balance函數現在調用了RLock和RUnlock方法來獲取和放一個讀取或者共享。Deposit函數沒有變化,會調用mu.Lock和mu.Unlock方法來獲取和放一個寫或互斥
这次修改后Bob的余额查询请求就可以彼此行地执行并且会很快地完成了。在更多的时间范围可用,且存款求也能够及时地被响应了。
這次脩改後Bob的餘額査詢請求就可以彼此行地執行併且會很快地完成了。在更多的時間范圍可用,且存款求也能夠及時地被響應了。
RLock能在临界区共享变量没有任何入操作可用。一般来说,我们不应该假设逻辑上的只读函数/方法也不去更新某一些量。比如一方法功能是访问一个变量,但它也有可能会同时去给一个内部的计数器+1(译注:可能是记录这个方法的访问次数啥的),或者去更新存--使即时的调用能更快。如果有疑惑的话,请使用互斥
RLock能在臨界區共享變量沒有任何入操作可用。一般來説,我們不應該假設邏輯上的隻讀函數/方法也不去更新某一些量。比如一方法功能是訪問一個變量,但它也有可能會同時去給一個內部的計數器+1(譯註:可能是記録這個方法的訪問次數啥的),或者去更新存--使卽時的調用能更快。如果有疑惑的話,請使用互斥
RWMutex只有当获得锁的大部分goroutine都是操作,而锁在竞争条件下,也就是goroutine们必须等待才能取到锁的时RWMutex才是最能带来好处的。RWMutex需要更复杂的内部记录,所以会让它比一般的无竞争锁的mutex慢一些。
RWMutex隻有當獲得鎖的大部分goroutine都是操作,而鎖在競爭條件下,也就是goroutine們必鬚等待才能取到鎖的時RWMutex才是最能帶來好處的。RWMutex需要更複雜的內部記録,所以會讓它比一般的無競爭鎖的mutex慢一些。