PHpullh

GO · 고루틴/채널

atomic 연산

sync/atomic으로 뮤텍스 없이 원자적 읽기/쓰기를 수행합니다. 단순 카운터에 최적입니다.

고루틴/채널중급atomiclock-freecompare-and-swapsync

핵심 설명

sync/atomic으로 뮤텍스 없이 원자적 읽기/쓰기를 수행합니다. 단순 카운터에 최적입니다.

Go code

package main

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

func main() {
	var counter atomic.Int64
	var wg sync.WaitGroup

	for i := 0; i < 1000; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			counter.Add(1)
		}()
	}

	wg.Wait()
	fmt.Println("카운터:", counter.Load())

	// atomic.Value: 임의 타입 저장
	var config atomic.Value
	type Config struct {
		Debug bool
		Level int
	}
	config.Store(Config{Debug: true, Level: 3})

	cfg := config.Load().(Config)
	fmt.Printf("설정: %+v\n", cfg)

	// CompareAndSwap
	var flag atomic.Bool
	swapped := flag.CompareAndSwap(false, true)
	fmt.Println("CAS 성공:", swapped)      // true
	swapped = flag.CompareAndSwap(false, true)
	fmt.Println("CAS 재시도:", swapped)     // false
}

학습 팁

Go 1.19+의 atomic.Int64, atomic.Bool 등 타입화된 atomic을 사용하면 타입 안전합니다.

주의할 점

atomic은 단일 변수만 보호합니다. 여러 변수를 함께 업데이트해야 하면 뮤텍스를 사용하세요.

자주 묻는 질문

atomic 연산란 무엇인가요?

sync/atomic 으로 뮤텍스 없이 원자적 읽기/쓰기를 수행합니다. 단순 카운터에 최적입니다.

atomic 연산 학습 시 주의할 점은 무엇인가요?

atomic은 단일 변수만 보호합니다. 여러 변수를 함께 업데이트해야 하면 뮤텍스를 사용하세요.

Continue Learning

Go 학습을 이어가세요

총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.