This commit is contained in:
chai2010
2016-01-18 09:53:55 +08:00
parent 324d2c8925
commit ae133636eb
4 changed files with 68 additions and 4 deletions

View File

@@ -56,7 +56,6 @@ func Balance() int {
由於在存款和査詢餘額函數中的臨界區代碼這麽短--隻有一行,沒有分支調用--在代碼最後去調用Unlock就顯得更爲直截了當。在更複雜的臨界區的應用中尤其是必鬚要盡早處理錯誤併返迴的情況下就很難去(靠人)判斷對Lock和Unlock的調用是在所有路徑中都能夠嚴格配對的了。Go語言里的defer簡直就是這種情況下的救星我們用defer來調用Unlock臨界區會隱式地延伸到函數作用域的最後這樣我們就從“總要記得在函數返迴之後或者發生錯誤返迴時要記得調用一次Unlock”這種狀態中獲得了解放。Go會自動幫我們完成這些事情。
```go
func Balance() int {
mu.Lock()
@@ -135,9 +134,6 @@ func Balance() int {
func deposit(amount int) { balance += amount }
```
當然這里的存款deposit函數很小實際上取款withdraw函數不需要理會對它的調用盡管如此這里的表達還是表明了規則。
封裝(§6.6), 用限製一個程序中的意外交互的方式可以使我們獲得數據結構的不變性。因爲某種原因封裝還幫我們獲得了併發的不變性。當你使用mutex時確保mutex和其保護的變量沒有被導出(在go里也就是小寫且不要被大寫字母開頭的函數訪問啦)無論這些變量是包級的變量還是一個struct的字段。