Immutability of Strings and Concurrency
Question:
Should we synchronize writes to strings? Given that strings are immutable, aren't we guaranteed a consistent state between reads and writes from multiple threads?
Answer:
String values in Go are indeed immutable, meaning their content cannot be modified once created. However, this immutability only applies to the string value itself, not to the variable holding the string.
Variables are mutable and can point to different string values over time. If multiple goroutines access a string variable concurrently, and at least one of them writes to it, synchronization is necessary. This ensures that writes to the variable are performed sequentially, preventing concurrent access to the string's variable, not its value.
Example:
Consider the following code:
<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>
Without synchronization, this code would result in a data race because multiple goroutines are writing to the variable holding the string. As a result, the final value of s could be either "hello" or "goodbye", depending on which goroutine accessed the variable last.
By using synchronization, such as a sync.Mutex, we ensure that only one goroutine can write to the variable at a time, preserving the expected behavior.
The above is the detailed content of Do Immutable Strings in Go Require Synchronization for Concurrent Writes?. For more information, please follow other related articles on the PHP Chinese website!