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은 단일 변수만 보호합니다. 여러 변수를 함께 업데이트해야 하면 뮤텍스를 사용하세요.