golang執行緒安全
目錄
1.golang的map是執行緒安全的嗎?怎麼安全使用map
不安全,需要進行資源保護。
sync互斥鎖,或者redis分散式鎖
或者:這個字典類型提供了一些常用的鍵值存取操作方法,並保證了這些操作的並發安全
var ma sync.Map //該類型是開箱即用,只需要聲明既可
ma.Store("key", "value") // 存儲值
ma.Delete("key") //刪除值
ma.LoadOrStore("key", "value")// 獲取值,如果沒有則存儲
fmt.Println(ma.Load("key"))//獲取值
//遍歷
ma.Range(func(key, value interface{}) bool {
fmt.Printf("key:%s ,value:%s \n", key, value)
//如果返回:false,則退出循環,
return true
})
2.執行緒獨享什麼,共享什麼
堆:根據程式碼動態分配記憶體,頻繁的new,delete造成空間不連續,從而產生大量碎片,使程式效率降低
棧:存放局部變數,由編譯器自動管理,無需我們手工控制
共享:
1.進程程式碼段
2.進程的公有數據(利用這些共享的數據,執行緒很容易的實現相互之間的通訊)
3.進程打開的文件描述符
4.訊號的處理器
5.進程的當前目錄
6.進程用戶ID與進程組ID
獨享:
當一個方法執行時,所有的變數和參數都會保存在堆棧中記憶體空間,這個空間是執行緒獨享的,所以執行緒之間不會相互衝突。
1.執行緒ID
2.暫存器組的值
3.執行緒的堆棧
4.錯誤返回碼
5.執行緒的訊號屏蔽碼
3.進程狀態轉換

4.Log包執行緒安全嗎?
安全,因為:
在輸出的位置做了執行緒安全的保護,加了鎖
l.mu.Lock()
defer l.mu.Unlock()
5.寫的循環隊列是不是執行緒安全?
channel上面實現的是執行緒安全
如果是切片實現,需要加鎖實現執行緒安全。但是效率變低了
不是,怎麼保證執行緒安全,加鎖,效率有點低啊,Go推崇原子操作和channel
6.go協程執行緒安全嗎
不安全,需要進行資源保護。
sync互斥鎖,或者redis分散式鎖
7.go為什麼高並發好?go的調度模型
因為協程,go天生支援並發
GMP:
goroutine說到底其實就是協程,但是它比執行緒更小,幾十個goroutine可能體現在底層就是五六個執行緒,Go語言內部幫你實現了這些goroutine之間的記憶體共享
8.Golang 中常用的並發模型
通過channel通知實現並發控制
通過sync包中的WaitGroup實現並發控制
在Go 1.7 以後引進的強大的Context上下文,實現並發控制
9.進程與執行緒
進程:資源單位(數據隔離)
執行緒:執行單位(數據共享)
ps:每個進程都自帶一個執行緒,執行緒才是真正的執行單位,進程只是再執行緒中提供資源
