문자열의 불변성과 동시성
질문:
쓰기를 문자열에 동기화해야 합니까? 문자열이 변경 불가능하다는 점을 고려하면 여러 스레드에서 읽기와 쓰기 사이에 일관된 상태가 보장되지 않나요?
답변:
Go의 문자열 값은 실제로 변경 불가능합니다. 즉, 일단 생성된 콘텐츠는 수정할 수 없습니다. 그러나 이 불변성은 문자열을 보유하는 변수가 아닌 문자열 값 자체에만 적용됩니다.
변수는 변경 가능하며 시간이 지남에 따라 다른 문자열 값을 가리킬 수 있습니다. 여러 고루틴이 동시에 문자열 변수에 액세스하고 그 중 적어도 하나가 여기에 쓰는 경우 동기화가 필요합니다. 이렇게 하면 변수에 대한 쓰기가 순차적으로 수행되어 해당 값이 아닌 문자열 변수에 대한 동시 액세스가 방지됩니다.
예:
다음 코드를 고려하세요.
<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>
동기화가 없으면 여러 고루틴이 문자열을 보유하는 변수에 쓰기 때문에 이 코드는 데이터 경합을 발생시킵니다. 결과적으로 s의 최종 값은 어떤 고루틴이 마지막으로 변수에 액세스했는지에 따라 "hello" 또는 "goodbye"가 될 수 있습니다.
sync.Mutex와 같은 동기화를 사용하여 우리는 한 번에 하나의 고루틴이 변수에 쓸 수 있으며 예상되는 동작을 유지합니다.
위 내용은 Go의 불변 문자열은 동시 쓰기를 위해 동기화가 필요합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!