Go語言第十五課 共享記憶體和競爭機制 鎖

2021-08-21 04:34:24 字數 2926 閱讀 6611

使用sync.mutex可以實現「臨界區」。

進入臨界區之前嘗試sync.mutex.lock(),如果沒有被其他協程鎖住,當前協程將獲得乙個互斥鎖。如果被其他協程先鎖住,這個操作將會被阻塞直到其他的協程釋放了這個互斥鎖。

執行完臨界區**之後需要呼叫sync.mutex.unlock()釋放互斥鎖。

package main

import (

"fmt"

"sync"

"bufio"

"os"

"time"

)func main()

func test(lock *sync.mutex, index int)

test start 4

test end 4

test start 2

test end 2

test start 1

test end 1

test start 6

test end 6

test start 5

test end 5

test start 3

test end 3

test start 7

test end 7

test start 8

test end 8

如果取消互斥鎖,即將lock()和unlock()注釋掉,結果為

test start 3

test start 5

test start 4

test start 8

test start 7

test start 1

test start 2

test start 6

test end 6

test end 3

test end 5

test end 4

test end 8

test end 7

test end 1

test end 2

package main

import (

"fmt"

"sync"

"bufio"

"os"

"time"

)var testcount = 0

func main()

func test_read(lock *sync.rwmutex, index int)

func test_write(lock *sync.rwmutex, index int)

test_read start 3

read value is 0

test_read end 3

test_write start 4

write value is 1

test_write end 4

test_read start 4

test_read start 6

test_read start 1

test_read start 2

test_read start 5

read value is 1

test_read end 5

read value is 1

test_read end 4

read value is 1

test_read end 6

read value is 1

test_read end 1

read value is 1

test_read end 2

test_write start 3

write value is 2

test_write end 3

test_write start 1

write value is 3

test_write end 1

test_write start 2

write value is 4

test_write end 2

test_write start 5

write value is 5

test_write end 5

test_write start 6

write value is 6

test_write end 6

對結果稍加分析可以看出,執行順序是這樣的:

讀3,寫4等待

寫4,讀4、6、1、2、5等待

讀5、4、6、1、2,寫3等待

寫3,寫1等待

寫1,寫2等待

寫2,寫5等待

寫5,寫6等待

寫6總結:讀的時候,可讀不可寫!寫的時候,不可讀不可寫!

package main

import (

"fmt"

"sync"

"time"

"bufio"

"os"

)var testcount = 0

func main()

func go_test(once *sync.once, index int)

func test_one()

go_test 1 start

------------test_one start

go_test 3 start

go_test 2 start

go_test 4 start

------------test_one end

go_test 1 end

go_test 2 end

go_test 3 end

go_test 4 end

由此可見,sync.once可以保證傳入的函式只做一遍。所以這個鎖的這種特別設計常用於代價稍大的初始化。

IO流第十五課,總結

一 步驟 建立檔案源,也就是路徑 選擇輸入 輸出流 操作 讀取 寫出 釋放資源 二 流 節點流 離資料源程式最近的流 1 節點流 可以處理一切檔案的複製 拷貝 1 輸入流 inputstream fileinputstream bytearrayinputstream 操作 read 位元組陣列 中...

第十五課 儲存與狀態

1.v0 v0 vi v 0 1 e t rc 電容真正儲存的是電荷,但對於乙個線性電容來說,它儲存的也是電壓,稱其為state。狀態 將來所需的所有輸入的彙總 電容的狀態就是電壓 vi 在零時刻以前的值無關緊要 電容電壓的未來值 是 電容初始狀態和未來時間輸入變化 的函式 vc t f vc 0 ...

第十五課 Map補充,異常,執行緒

常用的迭代方式 set entryset key value封裝成entry set keyset 遍歷key collection values 遍歷value hashmap key無序,並且不重複 hashset 就是value一樣的 hashmap treemap key排好序的 linke...