Maison > Article > développement back-end > Les chaînes immuables dans Go nécessitent-elles une synchronisation pour les écritures simultanées ?
Immuabilité des chaînes et concurrence
Question :
Devrions-nous synchroniser les écritures sur les chaînes ? Étant donné que les chaînes sont immuables, n'avons-nous pas la garantie d'un état cohérent entre les lectures et les écritures de plusieurs threads ?
Réponse :
Les valeurs de chaîne dans Go sont en effet immuables, ce qui signifie que leur contenu ne peut pas être modifié une fois créé. Cependant, cette immuabilité ne s'applique qu'à la valeur de chaîne elle-même, pas à la variable contenant la chaîne.
Les variables sont mutables et peuvent pointer vers différentes valeurs de chaîne au fil du temps. Si plusieurs goroutines accèdent simultanément à une variable chaîne et qu'au moins l'une d'entre elles y écrit, la synchronisation est nécessaire. Cela garantit que les écritures dans la variable sont effectuées de manière séquentielle, empêchant ainsi l'accès simultané à la variable de la chaîne, et non à sa valeur.
Exemple :
Considérez le code suivant :
<code class="go">var s string = "hello" func writeToString(s string) { s = "goodbye" } func main() { wg := sync.WaitGroup{} const num = 10 for i := 0; i < num; i++ { wg.Add(1) go func(i int) { defer wg.Done() writeToString(s) }(i) } wg.Wait() fmt.Println(s) }</code>
Sans synchronisation, ce code entraînerait une course aux données car plusieurs goroutines écrivent dans la variable contenant la chaîne. En conséquence, la valeur finale de s pourrait être "bonjour" ou "au revoir", selon la goroutine qui a accédé à la variable en dernier.
En utilisant la synchronisation, comme un sync.Mutex, nous garantissons que seul une goroutine peut écrire dans la variable à la fois, en préservant le comportement attendu.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!