>  기사  >  백엔드 개발  >  Go의 불변 문자열은 동시 쓰기를 위해 동기화가 필요합니까?

Go의 불변 문자열은 동시 쓰기를 위해 동기화가 필요합니까?

DDD
DDD원래의
2024-10-31 03:00:31119검색

Do Immutable Strings in Go Require Synchronization for Concurrent Writes?

문자열의 불변성과 동시성

질문:

쓰기를 문자열에 동기화해야 합니까? 문자열이 변경 불가능하다는 점을 고려하면 여러 스레드에서 읽기와 쓰기 사이에 일관된 상태가 보장되지 않나요?

답변:

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.