Section 3/161 menit
3. Teori: Isolation Domains dan Invariants Compiler
3. Teori: Isolation Domains dan Invariants Compiler
Model Mental Isolation
Swift Concurrency membagi eksekusi ke dalam isolation domains — konteks eksekusi eksklusif yang tidak bisa diakses bersamaan oleh lebih dari satu task.
swift
Isolation Domains dalam satu aplikasi:
┌─────────────────────────┐
│ MainActor Domain │ ← Satu-satunya — berjalan di main thread
│ (UIKit, SwiftUI update) │
└─────────────────────────┘
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Actor A │ │ Actor B │ │ Actor C │ ← Masing-masing eksklusif
│ (satu task │ │ (satu task │ │ (satu task │
│ pada satu │ │ pada satu │ │ pada satu │
│ waktu) │ │ waktu) │ │ waktu) │
└──────────────┘ └──────────────┘ └──────────────┘
┌─────────────────────────────────────────────────────┐
│ Nonisolated Domain (Cooperative Thread Pool) │ ← Bisa paralel
│ Task.detached, async let tanpa actor │
└─────────────────────────────────────────────────────┘
Tiga Invariant yang Dijaga Compiler
swift
1. MUTUAL EXCLUSION:
Pada satu waktu, hanya satu task yang bisa menjalankan kode
dalam isolation domain yang sama.
2. SENDABLE BOUNDARY:
Nilai yang melewati batas isolation domain harus Sendable
(atau dibuktikan aman oleh region analysis).
3. AWAIT = SUSPENSION POINT:
Setiap `await` adalah titik di mana actor bisa menjalankan
task lain. State setelah `await` bisa berbeda dari sebelumnya.
Bagaimana Compiler Memeriksa Isolation
Compiler Swift 6 melakukan analisis dua tahap:
Tahap 1 — Static isolation checking: Di compile time, compiler memeriksa setiap akses ke mutable state memiliki isolation yang sesuai.
Tahap 2 — Region analysis: Untuk setiap nilai non-Sendable yang melewati batas isolation, compiler memeriksa apakah nilai itu masih bisa diakses dari region asalnya.
swift
// Compiler memeriksa setiap akses mutable state
class State { // Non-Sendable
var value = 0
}
@MainActor
func update(state: State) {
state.value = 1 // ✓ — kita di @MainActor, boleh akses
}
func background(state: State) async {
state.value = 2 // ❌ — nonisolated, tapi State bukan Sendable
// Compiler: potential data race
}