go併發程式設計之二 原子性

2021-09-10 07:52:09 字數 1343 閱讀 1159

原子性相關的概念

我們知道redis操作是原子性的,究其具體原因是因為,redis服務是單執行緒的,當多個客戶端傳送命令

到服務端執行時,所有的命令會進入佇列,依次執行,如下圖:

原子性是指的某種東西不可分割或者不可中斷的一種屬性。

在考慮原子性時,經常需要做的第一件事是定義上下文或作用域,這個操作將被視為原子性的。這是思考

程式的基礎

讓我們看一下術語「不可分割」和「不可中斷」。這些術語意味著在你定義的上下文中,原子的東西

將在整個過程中發生,而不會同時發生任何事情。 這讓人有點糊塗,所以我們來看乙個例子:

i++
這是乙個任何人都可以明白的簡單**,但它很容易證明原子性的概念。 它可能看起來很原子,但是乙個

簡單的分析揭示了幾種操作:

. 檢索i的值。

. 增加i的價值。

. 儲存i的值。

儘管這些操作中的每乙個都是原子的,但三者的組合可能不是,取決於你的上下文。

當變數i的作用域僅侷限於某個函式,且外部環境無法改變i的值時,我們亦可以說i++是乙個原子操作

假設乙個秒殺場景,我們的商品數量goods_num是10,現在100個人來併發搶購,goods_num 的加減讀取

操作如果不是原子操作,那麼很可能 100 個人同時操作了庫存,導致庫存數量變為-90,防止併發資源的爭搶

就是我們接下來要說的同步。

我們可以使用原子操作包atomic解決對常見單個變數的增減操作問題

/**

減少庫存操作

*/func

decstock

(stock *

int32

,wg *sync.waitgroup)

func

main()

wg.wait()

fmt.

println

(num)

}

使用命令:

go run --race main.go
注意--race必須放在檔名稱的前面,該選項用來檢測執行時是否有資料競爭

Go併發程式設計之CAS操作

一 前言 go語言類似j a juc包也提供了一些列用於多執行緒之間進行同步的措施,比如低階的同步措施有 鎖 cas 原子變數操作類。相比j a來說go提供了獨特的基於通道的同步措施。我們先來看看go中cas操作 二 cas操作 go中的cas操作與j a中類似,都是借用了cpu提供的原子性指令來實...

VB程式設計之二

1,visual的含義是視覺化 視窗的設計形式稱為窗體,我們把窗體 控制項等這些組成 使用者介面的部件稱為物件,與乙個物件的乙個事件相關聯的是乙個程式過程。2,vb在輸入程式 的同時將立即檢查並顯示錯誤,提示設計者進行修改 開發過程 中得到的部分成果也可以執行,以便於檢查修改 它是一種視覺化的 物件...

Go併發程式設計之美 Load Store操作

一 前言 go語言類似j a juc包也提供了一些列用於多執行緒之間進行同步的措施,比如低階的同步措施有 鎖 cas 原子變數操作類。相比j a來說go提供了獨特的基於通道的同步措施。本節我們先來看看go中load store操作 二 load store操作 go中的load和store提供了原子...