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 BoolOptional<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