使用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...