Go Academy · Pelajaran

sync.Mutex dan sync.RWMutex

Corak penguncian dan penguncian baca-tulis

Pelajaran 1 daripada 413 langkah

sync.Mutex dan sync.RWMutex ialah pelajaran Go Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Go Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Go Academy merangkumi sejumlah 4 pelajaran.

Mengapa Menggunakan Kunci?

Apabila beberapa goroutin berkongsi keadaan boleh ubah, pembacaan dan penulisan serentak menyebabkan perlumbaan data. Kunci menyerikan akses supaya hanya satu goroutin memasuki bahagian kritikal pada satu-satu masa.

Asas sync.Mutex

Gunakan Lock sebelum membaca atau menulis keadaan yang dikongsi; gunakan Unlock selepas itu. Gunakan defer untuk menjamin pembukaan kunci walaupun fungsi mengalami panik.

var mu sync.Mutex
var counter int

func inc() {
    mu.Lock()
    defer mu.Unlock()
    counter++
}

Membenamkan Mutex dalam Struktur

Benamkan kunci dalam struktur yang dilindunginya. Mengikut konvensyen, kunci diisytiharkan betul-betul di atas medan yang dikawalnya.

type SafeCounter struct {
    mu sync.Mutex
    v  map[string]int
}
func (c *SafeCounter) Inc(key string) {
    c.mu.Lock()
    defer c.mu.Unlock()
    c.v[key]++
}

Jangan Salin Mutex

Mutex tidak boleh disalin selepas penggunaan pertama. Hantarkannya melalui penuding atau benamkannya dalam struktur yang dihantar melalui penuding. Alat go vet mengesan salinan.

sync.RWMutex

sync.RWMutex membolehkan beberapa pembaca serentak tetapi hanya seorang penulis. Gunakannya apabila operasi membaca lebih banyak dan penulisan jarang berlaku untuk meningkatkan daya pemprosesan.

var rw sync.RWMutex
var data map[string]int

func read(k string) int {
    rw.RLock()
    defer rw.RUnlock()
    return data[k]
}
func write(k string, v int) {
    rw.Lock()
    defer rw.Unlock()
    data[k] = v
}

RLock berbanding Lock

RLock memperoleh kunci baca (dikongsi); Lock memperoleh kunci tulis (eksklusif). Kunci tulis yang sedang menunggu menghalang kunci baca baharu, lalu mengelakkan kebuluran penulis.

TryLock (Go 1.18+)

mu.TryLock() memperoleh kunci hanya jika kunci itu sedang tidak dikunci, lalu mengembalikan boolean. Berguna apabila penyekatan tidak boleh diterima.

if mu.TryLock() {
    defer mu.Unlock()
    // critical section
}

Kebuntuan

Kebuntuan berlaku apabila goroutin A memegang kunci 1 sambil menunggu kunci 2, manakala goroutin B memegang kunci 2 sambil menunggu kunci 1. Sentiasa dapatkan kunci dalam susunan yang sama dan pendekkan bahagian kritikal.

Kehalusan Penguncian

Kunci berbutir kasar lebih mudah difahami tetapi mengurangkan keserentakan. Penguncian berbutir halus meningkatkan daya pemprosesan tetapi menambah kerumitan dan risiko kebuntuan. Mulakan dengan kunci kasar dan optimumkan jika pemprofilan menunjukkan persaingan.

Kunci berbanding Saluran

Gunakan kunci apabila melindungi keadaan yang dikongsi dengan ramai pembaca atau penulis. Gunakan saluran apabila memindahkan pemilikan data antara goroutin. Saluran adalah untuk komunikasi, manakala kunci adalah untuk penyegerakan.

Antara Muka sync.Locker

sync.Locker ialah antara muka dengan Lock dan Unlock. Kedua-dua Mutex dan RWMutex melaksanakannya, lalu membolehkan fungsi pembantu menerima mana-mana jenis tersebut.

Semakan Pantas

Bilakah anda patut menggunakan sync.RWMutex dan bukannya sync.Mutex?

Ringkasan: Mutex dan RWMutex

Perkara utama:

  • Mutex mengawal akses secara bersiri; sentiasa gunakan defer Unlock
  • Jangan sekali-kali menyalin Mutex selepas penggunaan pertama
  • RWMutex: berbilang pembaca OR satu penulis
  • Dapatkan kunci mengikut susunan yang konsisten untuk mengelakkan kebuntuan
Percuma untuk bermula

Pelajari Go dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
51
Pelajaran
203

Soalan Lazim

Adakah pelajaran “sync.Mutex dan sync.RWMutex” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Go Academy, termasuk “sync.Mutex dan sync.RWMutex”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Go Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “sync.Mutex dan sync.RWMutex”?

Corak penguncian dan penguncian baca-tulis Anda berlatih Go Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Go Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Go Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.

Berapa lamakah pelajaran “sync.Mutex dan sync.RWMutex” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Go Academy ini?

Ya. Setiap pelajaran Go Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. sync.Mutex dan sync.RWMutex
  2. sync.WaitGroup
  3. sync.Once dan sync.Map
  4. Pengesan Perlumbaan dan Corak Selamat
← Kembali ke Go Academy