Model Memori Go dan Happens-Before
Jaminan sinkronisasi dan pengurutan memori
Model Memori Go dan Happens-Before adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 2 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 Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.
Apa yang dimaksud dengan model memori?
Model memori Go menentukan kapan penulisan ke suatu variabel oleh satu goroutine dijamin terlihat oleh pembacaan oleh goroutine lain. Tanpa jaminan ini, program konkuren dapat mengamati nilai yang usang atau tidak konsisten.
Terjadi-sebelum
Hubungan terjadi-sebelum menjamin bahwa semua penulisan sebelum peristiwa A terlihat pada peristiwa B. Jika tidak ada hubungan terjadi-sebelum, pembacaan dapat mengamati penulisan apa pun—termasuk nilai nol.
Terjadi-sebelum yang dijamin: memulai goroutine
Segala sesuatu yang terjadi sebelum pernyataan go terjadi sebelum fungsi goroutine dimulai. Goroutine yang dibuat melihat semua penulisan yang dilakukan sebelum pembuatannya.
x := 10
go func() {
fmt.Println(x) // guaranteed to see 10
}()Dijamin: pengiriman/penerimaan saluran
Pengiriman melalui saluran terjadi sebelum penerimaan yang sesuai. Penutupan saluran terjadi sebelum penerimaan nilai nol. Inilah primitif sinkronisasi utama.
ch := make(chan int)
go func() { ch <- 42 }() // send hb receive
v := <-ch
fmt.Println(v) // guaranteed to see 42Dijamin: sync.Mutex
Pemanggilan Unlock ke-n pada mutex terjadi sebelum pemanggilan Lock ke-(n+1). Hal ini memastikan bahwa goroutine yang mengunci setelah pembukaan kunci melihat semua penulisan yang dilakukan sebelum pembukaan kunci.
Dijamin: sync.Once
Penyelesaian fungsi once.Do terjadi sebelum panggilan apa pun ke once.Do dikembalikan. Semua goroutine yang memanggil once.Do melihat proses inisialisasi tersebut.
Dijamin: penutupan saluran
Menutup saluran terjadi sebelum penerimaan yang mengembalikan nilai nol dari saluran yang tertutup. Beginilah saluran selesai menyiarkan sinyal ke banyak goroutine.
Tidak ada hubungan terjadi-sebelum: variabel bersama tanpa perlindungan
Jika dua goroutine mengakses suatu variabel tanpa sinkronisasi dan setidaknya salah satunya melakukan penulisan, perilakunya tidak terdefinisi. Detektor kondisi balapan dapat menangkap hal ini.
Operasi atomik
Paket atomic menyediakan operasi yang konsisten secara berurutan. Penyimpanan atomik terjadi sebelum pemuatan atomik terhadap variabel yang sama pada goroutine mana pun yang mengamati nilai yang disimpan.
Model memori untuk saluran
Untuk saluran berbuffer berkapasitas C, penerimaan ke-k terjadi sebelum pengiriman ke-(k+C) selesai. Hal ini memodelkan kapasitas buffer yang terbatas dan menjamin tekanan balik.
Aturan praktis
Jika berbagi data antar-goroutine: gunakan saluran untuk memindahkan kepemilikan, atau gunakan mutex/operasi atomik untuk melindungi pembacaan dan penulisan. Jangan mengandalkan intuisi tentang urutan tanpa sinkronisasi.
Pemeriksaan Singkat
Manakah dari berikut ini yang membuat hubungan terjadi-sebelum antara goroutine?
Ringkasan: Model Memori Go
Poin penting:
- Terjadi-sebelum menentukan kapan penulisan terlihat antar-goroutine
- Saluran, Mutex, Once, dan pemulaan goroutine membuat hubungan HB
- Akses tanpa sinkronisasi ke keadaan bersama yang dapat berubah tidak terdefinisi
- Gunakan detektor kondisi balapan untuk menangkap pelanggaran
Belajar Go dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Model Memori Go dan Happens-Before” gratis?
Ya — teks lengkap “Model Memori Go dan Happens-Before” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Model Memori Go dan Happens-Before”?
Jaminan sinkronisasi dan pengurutan memori Kamu berlatih Go 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 Go Academy?
Tidak diperlukan pengalaman sebelumnya. Go 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 2 dari 4.
Berapa lama pelajaran “Model Memori Go dan Happens-Before” 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 Go Academy ini?
Ya. Setiap pelajaran Go 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
- Stack vs Heap dan Analisis Escape
- Model Memori Go dan Happens-Before
- Internal Pengumpul Sampah
- Mengurangi Alokasi: sync.Pool dan Arena