Masalah Perlombaan Data
Pahami mengapa mutasi bersamaan tidak aman.
Masalah Perlombaan Data adalah pelajaran Swift Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Swift Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Swift Academy mencakup 4 pelajaran total.
Apa Itu Perlombaan Data
perlombaan data terjadi ketika dua utas atau lebih mengakses lokasi memori yang sama secara bersamaan, setidaknya satu akses merupakan penulisan, dan tidak ada sinkronisasi di antara akses tersebut.
Hasilnya adalah perilaku tak terdefinisi: nilai rusak, aplikasi mogok, atau kesalahan yang hanya muncul saat beban tinggi.
Keadaan Dapat Diubah Bersama
Akar penyebab perlombaan data adalah keadaan dapat diubah bersama. Jika banyak tugas dapat membaca dan menulis variabel yang sama, urutannya menjadi tidak dapat diprediksi.
Counter di bawah ini dapat kehilangan kenaikan karena count += 1 merupakan operasi baca-ubah-tulis, bukan operasi atomik.
final class Counter {
var count = 0
func increment() {
count += 1 // read, add, write: not atomic
}
}Mengapa Kenaikan Bisa Hilang
Pernyataan count += 1 dikompilasi menjadi tiga langkah: memuat nilai, menambahkan satu, lalu menyimpannya kembali.
Jika dua utas memuat 5 pada saat yang sama, keduanya menyimpan 6, sehingga satu kenaikan hilang.
// Thread A loads 5
// Thread B loads 5
// Thread A stores 6
// Thread B stores 6 <-- lost updateTearing pada Nilai yang Lebih Besar
Selain pembaruan yang hilang, penulisan bersamaan pada nilai yang terdiri dari beberapa kata, seperti struktur atau nilai 64-bit pada beberapa platform, dapat terpecah: pembaca melihat sebagian dari satu penulisan dan sebagian dari penulisan lainnya.
struct Point { var x: Double; var y: Double }
var p = Point(x: 0, y: 0)
// Concurrent writes may leave x from one write and y from anotherPerbaikan Lama: Lock
Sebelum Swift Concurrency, solusi klasiknya adalah lock atau muteks. Hanya satu utas yang memegang lock pada satu waktu, sehingga akses berlangsung secara berurutan.
Lock memang berfungsi, tetapi mudah disalahgunakan: lupa memanggil unlock, kebuntuan, dan inversi prioritas.
import Foundation
final class SafeCounter {
private let lock = NSLock()
private var count = 0
func increment() {
lock.lock()
defer { lock.unlock() }
count += 1
}
}Antrean Pengiriman Serial
Pendekatan klasik lainnya adalah antrean pengiriman serial. Semua perubahan diarahkan ke satu antrean, sehingga tidak pernah berlangsung secara bersamaan.
import Foundation
final class QueueCounter {
private let queue = DispatchQueue(label: "counter")
private var count = 0
func increment() {
queue.async { self.count += 1 }
}
}Mengapa Sinkronisasi Manual Rapuh
Lock dan antrean bergantung pada kedisiplinan. Kompilator tidak memeriksa apakah setiap akses sudah dilindungi.
Satu pembacaan tanpa perlindungan saja dapat lolos dan perlombaan data muncul kembali. Tidak ada jaminan saat kompilasi.
// Nothing stops a careless reader from doing this:
// let value = counter.count // unsynchronized read = raceKonkurensi Swift Mengubah Segalanya
Swift Concurrency menjadikan keamanan terhadap perlombaan data sebagai fitur bahasa, bukan sekadar kebiasaan.
Tiga alat bekerja sama: actor untuk melindungi keadaan yang dapat diubah, Sendable untuk tipe yang aman dibagikan, dan kompilator untuk menegakkan keduanya.
actor Counter {
private var count = 0
func increment() { count += 1 }
}Aktor Menserialkan Akses
aktor menjamin bahwa hanya satu tugas yang menjalankan kode pengubahnya pada satu waktu. Lingkungan waktu jalan secara otomatis menserialkan akses.
Anda tidak pernah menulis lock; model aktor menyediakan sinkronisasinya.
actor BankAccount {
private(set) var balance = 0
func deposit(_ amount: Int) { balance += amount }
}Penegakan Saat Kompilasi
Kompilator menolak akses Anda ke keadaan yang diisolasi aktor tanpa melalui aktor tersebut. Panggilan lintas aktor menjadi asinkron (await).
Dengan demikian, perlombaan saat lingkungan waktu jalan berubah menjadi kesalahan saat kompilasi.
let account = BankAccount()
// Must await: balance is actor-isolated
// let b = await account.balanceDapat Dikirim Membatasi Data yang Melintasi Utas
Protokol Sendable menandai tipe yang aman diteruskan melintasi batas konkurensi.
Kompilator memblokir pengiriman keadaan yang dapat diubah dan bukan Sendable ke tugas lain, sehingga perlombaan ditutup pada tingkat tipe.
struct Money: Sendable {
let amount: Int
let currency: String
}Pemeriksaan Singkat: Perlombaan Data
Uji pemahaman Anda tentang penyebab perlombaan data.
Ringkasan: Masalah Perlombaan Data
Perlombaan data berasal dari keadaan dapat diubah bersama yang diakses secara bersamaan tanpa sinkronisasi, sehingga menghasilkan pembaruan yang hilang, nilai yang terpecah, dan perilaku tak terdefinisi.
Perbaikan lama, yaitu lock dan antrean serial, memang berfungsi, tetapi tidak diperiksa dan rapuh. Swift Concurrency mengganti kebiasaan dengan penegakan aturan: actor mengisolasi keadaan, Sendable membatasi data yang melintasi batas, dan kompilator memverifikasi keamanan. Bagian selanjutnya dari kursus ini membahas alat-alat tersebut secara mendalam.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Masalah Perlombaan Data” gratis?
Ya — teks lengkap “Masalah Perlombaan Data” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Swift Academy, upgrade ke CoddyKit PRO. Kursus Swift Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Masalah Perlombaan Data”?
Pahami mengapa mutasi bersamaan tidak aman. Kamu berlatih Swift Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Swift Academy?
Tidak diperlukan pengalaman sebelumnya. Swift Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Masalah Perlombaan Data” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Swift Academy ini?
Ya. Setiap pelajaran Swift Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Masalah Perlombaan Data
- Protocol Sendable
- Isolasi Actor dan nonisolated
- Migrasi ke Konkurensi Ketat