Go語言中的原子變數


Go語言中的原子變數提供了一種替代方案,可以使用鎖或其他同步原語來對共享變數執行原子操作。在併發程式設計中,同步和互斥對於確保執行緒或程序可以訪問共享資源而不會相互干擾至關重要。原子變數的使用使得對共享變數的併發訪問能夠快速且可擴充套件地進行同步和協調。

什麼是原子變數?

原子變數是一個共享變數,可以被多個goroutine同時讀取和寫入,同時確保所有操作都是原子的。因此,對原子變數的操作是不可分割的,不會被其他執行緒或程序中斷。

Go程式語言中的“sync/atomic”包提供各種原子變數,包括指標、布林值和整數。這些型別支援加法、減法、比較並交換和載入並存儲等操作,這些操作在併發系統中用於實現同步和互斥。

如何在Go中使用原子變數

在Go中使用原子變數之前,首先需要匯入“sync/atomic”包。然後,您可以使用下面列出的型別之一建立一個原子變數:

  • “int32”,“int64” - 原子整數型別

  • “uint32”,“uint64” - 原子無符號整數型別

  • “uintptr” - 原子指標型別

  • “bool” - 原子布林型別

建立原子變數後,可以使用“sync/atomic”包提供的函式對其執行原子操作。

示例

package main

import (
   "fmt"
   "sync/atomic"
)

func main() {
   var counter int64 = 0

   // Atomic increment
   atomic.AddInt64(&counter, 1)

   // Atomic compare-and-swap
   expected := int64(0)
   new := int64(1)
   atomic.CompareAndSwapInt64(&counter, expected, new)

   // Atomic load
   value := atomic.LoadInt64(&counter)

   fmt.Println(value)
}

輸出

1

這裡,我們構造型別為“int64”的原子變數“counter”並將其初始化為零。然後,該變數將經歷三個原子操作:載入、比較並交換和遞增。

“AddInt64”函式以原子方式將變數增加指定數量。“CompareAndSwapInt64”函式對變數執行原子比較並交換操作,只有當其當前值與預期值匹配時才更改其值。“LoadInt64”函式然後以原子方式載入變數的當前值。

結論

由於原子變數,Go可以在不使用鎖或其他同步原語的情況下快速有效地執行共享變數的原子操作。同時保持高效率和可擴充套件性,您可以使用原子變數來確保對共享資源的併發訪問是同步和互斥的。

更新於:2023年4月6日

2K+ 瀏覽量

啟動您的職業生涯

完成課程獲得認證

開始學習
廣告