共享內存并發機制
===
> 像java這樣的語言實現并發就涉及共享資源,為了保證資源的安全性就要用到鎖
go 并發之間的通訊可以用channel吧并行數據轉變為串行數據,我們還是向講一講老的處理方案
### Package Sync包中有兩個鎖
一個是Mutex 互斥寫鎖
一個是RWLock 讀寫鎖
沒有鎖的下場
~~~
func TestCounter(t *testing.T) {
counter := 0
var wg sync.WaitGroup
for i := 0;i<5000;i++ {
wg.Add(1)
go func() {
counter++
wg.Done()
}()
}
wg.Wait()
t.Log(counter)
}
~~~

這個根本就不對阿!
哈哈哈 有可能幾個協程同時寫導致的
所以我們要使用鎖來實現
我們向計算以下這個程序的時間
~~~
func TestCounter(t *testing.T) {
nowTime := time.Now().UnixNano()
counter := 0
var wg sync.WaitGroup
for i := 0;i<5000;i++ {
wg.Add(1)
go func() {
counter++
wg.Done()
}()
}
wg.Wait()
t.Log(counter)
tTime := time.Now().UnixNano()
fmt.Println("time: ",(tTime - nowTime))
}
~~~
這里用nano秒來計算,為什么了go太快了
現在測試結果是:
```
=== RUN TestCounter
time: 2071910
--- PASS: TestCounter (0.00s)
share_test.go:28: 4334
PASS
```
### 我們現在加上鎖
~~~
func TestMutCounter(t *testing.T) {
nowTime := time.Now().UnixNano()
var nut sync.Mutex
counter := 0
var wg sync.WaitGroup
for i := 0;i<5000;i++ {
wg.Add(1)
go func() {
nut.Lock()
defer nut.Unlock()
counter++
wg.Done()
}()
}
wg.Wait()
t.Log(counter)
tTime := time.Now().UnixNano()
fmt.Println("time: ",(tTime - nowTime))
}
~~~
現在的返回結果
```
=== RUN TestMutCounter
time: 2151931
--- PASS: TestMutCounter (0.00s)
share_test.go:48: 5000
PASS
```
答案是對了但是大家有沒有發現這個時間,比上一個沒有加鎖的時間多
這個就鎖帶來的性能消耗
為了解決這個問題我們用讀寫鎖來實現一遍
看下面的RWMutex
- Hello World
- UDP
- UDP服務端
- UDP客戶端
- UDP廣播
- 錯誤處理
- 編寫好的異常處理
- panic和recover
- 并發編程
- Hello Goruntine
- 共享內存并發機制
- RWMutex
- CSP并發機制
- 多路復用和超時控制
- 通道關閉與廣播
- Context與任務的取消
- 只運行一次
- 按需任意任務完成
- 所有任務完成
- 補充:range channel注意實現
- 對象池
- sync.Pool臨時對象池
- 單元測試
- 表格測試法
- Banchmark
- BDD
- 反射
- 利用反射編寫靈活的代碼
- Struct Tag
- 萬能程序
- 常用架構模式
- Pipe-filter pattern
- Micro Kernel
- 性能分析
- 高性能代碼
- sync.MAP分析
- Concurrent Map
- GC友好的代碼
- Uber開發風格規范