sync.Mutex et sync.RWMutex
Modèles de verrouillage et de verrouillage en lecture-écriture
sync.Mutex et sync.RWMutex est une leçon Go Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Go Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Go Academy comprend 4 leçons au total.
Pourquoi utiliser des mutex ?
Lorsque plusieurs routines Go partagent un état modifiable, les lectures et écritures concurrentes provoquent des conditions de concurrence. Un mutex sérialise les accès afin qu’une seule routine Go à la fois entre dans la section critique.
Principes de base de sync.Mutex
Appelez Lock avant de lire ou d’écrire l’état partagé, puis Unlock après. Utilisez defer pour garantir le déverrouillage, même si la fonction provoque une panique.
var mu sync.Mutex
var counter int
func inc() {
mu.Lock()
defer mu.Unlock()
counter++
}Intégrer un mutex dans une structure
Intégrez le mutex dans la structure qu’il protège. Par convention, le mutex est déclaré juste au-dessus des champs qu’il protège.
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]++
}Ne copiez pas un Mutex
Un Mutex ne doit pas être copié après sa première utilisation. Transmettez-le par pointeur ou intégrez-le dans une structure transmise par pointeur. L’outil go vet détecte les copies.
sync.RWMutex
sync.RWMutex permet à plusieurs lecteurs d’accéder simultanément aux données, mais n’autorise qu’un seul écrivain. Utilisez-le lorsque les lectures sont majoritaires et les écritures rares afin d’augmenter le débit.
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 ou Lock
RLock acquiert un verrou de lecture (partagé), tandis que Lock acquiert un verrou d’écriture (exclusif). Un verrou d’écriture en attente bloque les nouveaux verrous de lecture et empêche la famine des écrivains.
TryLock (Go 1.18 et versions ultérieures)
mu.TryLock() acquiert le verrou uniquement s’il est actuellement déverrouillé et renvoie une valeur booléenne. Cette méthode est utile lorsque le blocage est inacceptable.
if mu.TryLock() {
defer mu.Unlock()
// critical section
}Interblocages
Un interblocage se produit lorsque la routine Go A détient le verrou 1 et attend le verrou 2, tandis que la routine Go B détient le verrou 2 et attend le verrou 1. Acquérez toujours les verrous dans le même ordre et gardez les sections critiques courtes.
Granularité des verrous
Un verrou grossier est plus facile à comprendre, mais réduit le parallélisme. Des verrous fins améliorent le débit, mais augmentent la complexité et le risque d’interblocage. Commencez avec un verrou grossier et optimisez uniquement si le profilage révèle de la contention.
Mutex ou canal
Utilisez un mutex pour protéger un état partagé comportant de nombreux lecteurs et écrivains. Utilisez un canal pour transférer la propriété des données entre routines Go. Les canaux servent à communiquer, les mutex à synchroniser.
Interface sync.Locker
sync.Locker est une interface qui fournit Lock et Unlock. Mutex et RWMutex l’implémentent tous deux, ce qui permet aux fonctions utilitaires d’accepter l’un ou l’autre type.
Vérification rapide
Quand devez-vous utiliser sync.RWMutex plutôt que sync.Mutex ?
Récapitulatif : Mutex et RWMutex
Points essentiels :
- Mutex sérialise les accès : utilisez toujours defer Unlock
- Ne copiez jamais un Mutex après sa première utilisation
- RWMutex : plusieurs lecteurs OR un seul rédacteur
- Acquérez les verrous dans un ordre cohérent pour éviter les interblocages
Questions Fréquemment Posées
La leçon « sync.Mutex et sync.RWMutex » est-elle gratuite ?
Oui — le texte complet de « sync.Mutex et sync.RWMutex » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Go Academy, passe à CoddyKit PRO. Le cours Go Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « sync.Mutex et sync.RWMutex » ?
Modèles de verrouillage et de verrouillage en lecture-écriture Tu pratiques Go Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Go Academy ?
Aucune expérience préalable n'est requise. Go Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.
Combien de temps prend la leçon « sync.Mutex et sync.RWMutex » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Go Academy ?
Oui. Chaque leçon Go Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- sync.Mutex et sync.RWMutex
- sync.WaitGroup
- sync.Once et sync.Map
- Détecteur de courses et modèles sûrs