樂觀鎖與悲觀鎖總結
854
2025-04-03
一,并發編程
1.1,并發和并行的區別
并發:
并發,就是通過一種算法將 CPU 資源合理地分配給多個任務,當一個任務執行 I/O 操作時,CPU 可以轉而執行其它的任務,等到 I/O 操作完成以后,或者新的任務遇到 I/O 操作時,CPU 再回到原來的任務繼續執行。
通過將 CPU 的使用權在恰當的時機分配給不同的任務,使得多個任務在視覺上看起來是一起執行的。CPU 的執行速度極快,多任務切換的時間也極短,用戶根本感受不到,所以并發執行看起來才跟真的一樣。
總結:
其實并發就是單核cpu不斷的切換任務,給我們的感覺像是多個任務同時進行的。
并行:
多核 CPU 的每個核心都可以獨立地執行一個任務,而且多個核心之間不會相互干擾。在不同核心上執行的多個任務,是真正地同時運行,這種狀態就叫做并行。
一圖來區別它們。
1.2,Goroutine
go中使用Goroutine來實現并發concurrently。Go應用程序可以并發運行數千個Goroutines。
func hello(i int) { println("hello world : " + fmt.Sprint(i)) } func main() { for i := 0; i < 5; i++ { go func(j int) { hello(j) }(i) } time.Sleep(time.Second) }
如上代碼開了五個任務并發執行,輸出來看一下。
1.3,channel
Go 語言中的通道(channel)是一種特殊的類型。通道像一個傳送帶或者隊列,總是遵循先入先出(First In First Out)的規則,保證收發數據的順序。每一個通道都是一個具體類型的導管,也就是聲明channel的時候需要為其指定元素類型。
例子:
package main func main() { src := make(chan int) dest := make(chan int, 3) go func() { defer close(src) for i := 0; i < 10; i++ { src <- i } }() go func() { defer close(dest) for i := range src { dest <- i * i } }() for i := range dest { println(i) } }
上述代碼解釋:
A子協程發生0~9數字到無緩沖通道。
B子協程將傳入的數字計算為平方到有緩沖通道。
主協程輸出結果如下:
1.4,并發安全Lock
線程安全是指,函數或者某個函數庫在多線程的模式被調用時,能夠正確處理多個線程之間共享變量,使得程序可以正常運行。
線程調用時線程之間會隨時發生切換會發生不可預料的結果,出現線程不安全。
Lock可以在“關鍵的位置”提供串行特性,保證數據安全與獨立
1.5,WaitGroup
Go語言中除了可以使用通道(channel)和互斥鎖進行兩個并發程序間的同步外,還可以使用等待組進行多個任務的同步,等待組可以保證在并發環境中完成指定數量的任務
WaitGroup 值在內部維護著一個計數,此計數的初始默認值為零。
func hello(i int) { println("hello world : " + fmt.Sprint(i)) } func main() { var wg sync.WaitGroup for i := 0; i < 5; i++ { wg.Add(1) go func(j int) { defer wg.Done() hello(j) }(i) } wg.Wait() }
輸出來看一下。
Go
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。