Функция atomic.LoadInt64

Функция atomic.LoadInt64 выполняет атомарное чтение значения типа int64. В качестве единственного параметра она принимает указатель на переменную типа int64, а возвращает текущее значение этой переменной. Эта функция гарантирует, что операция чтения будет выполнена как единое целое, без возможности прерывания и возникновения гонок данных между горутинами.

Синтаксис

goatomic.LoadInt64(addr *int64) int64

Пример

Давайте рассмотрим простой пример использования функции atomic.LoadInt64 для чтения значения переменной:

gopackage main

import (
  "fmt"
  "sync/atomic"
)

func main() {
  var counter int64 = 100
  val := atomic.LoadInt64(&counter)
  fmt.Println(val)
}

Результат выполнения кода:

go100

Пример

Теперь рассмотрим пример с конкурентным доступом к переменной. Две горутины атомарно изменяют и считывают значение:

gopackage main

import (
  "fmt"
  "sync"
  "sync/atomic"
  "time"
)

func main() {
  var counter int64 = 0
  var wg sync.WaitGroup

  wg.Add(1)
  go func() {
    defer wg.Done()
    for i := 0; i < 5; i++ {
      atomic.AddInt64(&counter, 10)
      time.Sleep(10 * time.Millisecond)
    }
  }()

  wg.Add(1)
  go func() {
    defer wg.Done()
    for i := 0; i < 5; i++ {
      val := atomic.LoadInt64(&counter)
      fmt.Printf("Current value: %d\n", val)
      time.Sleep(10 * time.Millisecond)
    }
  }()

  wg.Wait()
}

Результат выполнения кода:

go"Current value: 10"
"Current value: 20"
"Current value: 30"
"Current value: 40"
"Current value: 50"

Пример

В этом примере показано, как atomic.LoadInt64 используется для безопасного чтения значения, которое может быть изменено в любой момент другой горутиной:

gopackage main

import (
  "fmt"
  "sync/atomic"
  "time"
)

func main() {
  var value int64 = 42

  go func() {
    for i := 0; i < 3; i++ {
      atomic.AddInt64(&value, 5)
      time.Sleep(50 * time.Millisecond)
    }
  }()

  for i := 0; i < 3; i++ {
    current := atomic.LoadInt64(&value)
    fmt.Printf("Read: %d\n", current)
    time.Sleep(100 * time.Millisecond)
  }
}

Результат выполнения кода:

go"Read: 42"
"Read: 47"
"Read: 52"

Смотрите также

  • функцию atomic.StoreInt64,
    которая атомарно устанавливает новое значение для 64-битного целого числа
  • функцию atomic.AddInt64,
    которая атомарно прибавляет значение к 64-битному целому числу
  • функцию atomic.SwapInt64,
    которая атомарно заменяет значение и возвращает старое
  • функцию atomic.CompareAndSwapInt64,
    которая атомарно сравнивает и заменяет значение