Section 4/101 menit

4. Atomic\<Value\>

4. Atomic<Value>

Konsep: Lock-Free untuk Tipe Primitif

Atomic<Value> untuk operasi pada tipe yang mendukung AtomicRepresentable:

  • Integer types: Int, Int8, Int16, Int32, Int64
  • Unsigned: UInt, UInt8, UInt16, UInt32, UInt64
  • Bool
  • Optional<T> di mana T adalah pointer/reference
swift
import Synchronization

// Inisialisasi — harus var, Atomic bukan Sendable sepenuhnya
let requestCount = Atomic(0)

// Load: baca nilai
let count = requestCount.load(ordering: .relaxed)

// Store: tulis nilai
requestCount.store(42, ordering: .relaxed)

// Exchange: tulis nilai baru, dapatkan nilai lama
let old = requestCount.exchange(0, ordering: .acquiring)

// Add (hanya untuk integer)
requestCount.add(1, ordering: .relaxed)
let newValue = requestCount.wrappingAdd(1, ordering: .relaxed)  // overflow-safe

// Compare-and-Exchange (CAS)
let (exchanged, current) = requestCount.compareExchange(
    expected: 5,
    desired: 10,
    ordering: .sequentiallyConsistent
)
// exchanged = true jika nilai sebelumnya adalah 5 dan berhasil di-ganti ke 10
// current = nilai actual setelah operasi

Mengapa Atomic Butuh var dan Bukan let?

swift
// Atomic<Value> harus disimpan sebagai property yang stable address-nya
// Karena implementasinya menggunakan pointer ke lokasi memori tetap

// Sebagai stored property (OK):
class RequestTracker {
    let count = Atomic(0)  // OK: class memberikan stable address
}

// Sebagai local variable (OK dengan var):
var localCounter = Atomic(0)

// Sebagai let local (mungkin tidak OK tergantung konteks)
// Hindari Atomic sebagai local var yang di-copy