Go併發模式之 約束

2021-09-12 18:52:57 字數 1445 閱讀 3854

約束:

在編寫併發**的時候,有以下幾種不同的保證操作安全的方法。

1。 用於共享記憶體的同步原語(如sync.mutex)

2. 通過通訊來 共享記憶體來進行同步(如 channel)

在併發處理中還有其他幾種情況也是隱式併發安全的:

3。 不會發生改變的資料

4。 受到保護的資料

約束:特定約束,和 詞法約束

特定約束:是通過公約實現約束的。 無論是由語言社群, 你所在的團隊, 還是你的**庫設定。 在我看來,堅持約束很難在任何規模 的專案上

進行協調。 除非你有工具在每次有人提交**時對你的**進行靜態分析。

func main() 

} handledata := make(chan int)

go loopdata(handledata)

for num := range handledata

}//0

//0//0

//0

按照慣例: 我們只能從 loopdata函式訪問它。 不能直接 range data
詞法約束: 使用詞法作用域 公開 用於多個併發程序的正確資料。 這使得做錯事是不可能的。回想一下 channel 部分,它討論的是將channel 的讀寫處理

暴露給需要它們的併發程序。

func main()

}()return results

} //將channel 的使用約束為唯讀。

consumer := func(results <-chan int)

fmt.println("done receiving!")

} results := chanowner()

consumer(results)

}

channel 是併發安全的, 來看乙個使用 不是併發安全的資料結構的約束例子,它是 bytes.buffer
func main()

fmt.println(buff.string())

} var wg sync.waitgroup

wg.add(2)

data := byte("golang")

go printdata(&wg, data[:3])

go printdata(&wg, data[3:])

wg.wait()

}//ang

//gol

我們傳入切片的不同子集,因此約束了我們開始的goroutine。 由於詞法範圍的原因,我們已經不可能執行錯誤的操作,所以我們不需要通過通訊完成

記憶體訪問同步 或 共享資料。

我們傳入切片的不同子集,因此約束了我們開始的goroutine。 由於詞法範圍的原因,我們已經不可能執行錯誤的操作,所以我們不需要通過通訊完成記憶體訪問同步  或 共享資料。

總結之約束

1 primary key 主鍵可以保證每行記錄唯一性,還可以使用主鍵連線其它表,這樣這兩張表會形成一種關係。所謂的 關係 型資料管理系統的關係就是由此來的。下面建立 乙個pkablumablumid 主鍵。alter table album add constraint pkalbumalbumi...

mySQL之約束條件

primary key pk 標識該字段為該錶的主鍵,可以唯一的標識記錄 foreign key fk 標識該字段為該錶的外來鍵 not null 標識該欄位不能為空 unique key uk 標識該字段的值是唯一的 auto increment 標識該字段的值自動增長 整數型別,而且為主鍵 de...

mysql語句之約束語句

約束語句 not null 非空 default 預設約束語句 unique 唯一約束語句 primary 主鍵 唯一 非空 auto increment 自動增長 foreign key 從表id reference 主表名 id 表與表之間建立聯絡 primary key 主鍵 特點 1 不能重...