golang執行緒安全

2022-10-04 00:24:21 字數 1507 閱讀 1434

目錄

不安全,需要進行資源保護。

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 inte***ce{}) bool )

堆:根據**動態分配記憶體,頻繁的new,delete造成空間不連續,從而產生大量碎片,使程式效率降低

棧:存放區域性變數,由編譯器自動管理,無需我們手工控制

共享: 1.程序**段

2.程序的公有資料(利用這些共享的資料,執行緒很容易的實現相互之間的通訊)

3.程序開啟的檔案描述符

4.訊號的處理器

5.程序的當前目錄

6.程序使用者id與程序組id

獨享: 當乙個方法執行時,所有的變數和引數都會儲存在堆疊中記憶體空間,這個空間是執行緒獨享的,所以執行緒之間不會相互衝突。

1.執行緒id

2.暫存器組的值

3.執行緒的堆疊

4.錯誤返回碼

5.執行緒的訊號遮蔽碼

安全,因為:

在輸出的位置做了執行緒安全的保護,加了鎖

l.mu.lock()

defer l.mu.unlock()

channel上面實現的是執行緒安全

如果是切片實現,需要加鎖實現執行緒安全。但是效率變低了

不是,怎麼保證執行緒安全,加鎖,效率有點低啊,go推崇原子操作和channel

不安全,需要進行資源保護。

sync互斥鎖,或者redis分布式鎖

因為協程,go天生支援併發

gmp:

goroutine說到底其實就是協程,但是它比執行緒更小,幾十個goroutine可能體現在底層就是五六個執行緒,go語言內部幫你實現了這些goroutine之間的記憶體共享

通過channel通知實現併發控制

通過sync包中的waitgroup實現併發控制

在go 1.7 以後引進的強大的context上下文,實現併發控制

程序:資源單位(資料隔離)

執行緒:執行單位(資料共享)

​ ps:每個程序都自帶乙個執行緒,執行緒才是真正的執行單位,程序只是再執行緒中提供資源

1 Golang執行緒安全(簡單例子)

var money int 0 func add pint int func addmoney time.sleep time.second 5 fmt.println money 預期結果是100000000,但是由於add方法是協程方式呼叫的,存在併發的情況,導致結果不符合預期。全域性變數 va...

Golang的併發安全

channel是go中代替共享記憶體的通訊方式,channel從底層實現上是一種佇列,在使用的時候需要通道的傳送方和接收方需要知道資料型別和具體通道。如果有一端沒有準備好或訊息沒有被處理會阻塞當前端。actor模型 在actor模型中,主角是actor,類似一種worker,actor彼此之間直接傳...

golang 程式休眠 golang 執行緒與通道

首先我們來看執行緒,在golang裡面也叫goroutine 下面我們先來看乙個例子吧 import fmt funcmain i fmt.println 2 上面的 就建立了乙個匿名函式,並且還傳入了乙個引數i,下面括號裡的i是實參,a是形參。那麼上面的 能按照我們預想的列印1 2 3嗎?告訴你們...