Go的slice是并发安全的,可以在多个goroutine中并发读写slice。但是需要注意的是,当多个goroutine同时对同一个slice进行写操作时,可能会发生竞态条件(race condition)导致不确定的结果。为了避免这种情况,可以使用互斥锁(mutex)来保护slice的并发访问。

在Go中,可以使用sync包中的Mutex类型来实现互斥锁。通过在对slice进行读写操作之前先调用Lock()方法获取锁,并在操作完成后调用Unlock()方法释放锁,可以保证同一时间只有一个goroutine能够对slice进行写操作。

以下是一个使用互斥锁保护slice并发访问的示例代码:

package main

import (
	"fmt"
	"sync"
)

func main() {
	var mu sync.Mutex
	var wg sync.WaitGroup

	slice := []int{}

	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func(index int) {
			defer wg.Done()

			mu.Lock()
			defer mu.Unlock()

			slice = append(slice, index)
		}(i)
	}

	wg.Wait()
	fmt.Println(slice)
}

在上述代码中,通过sync.Mutex来定义了一个互斥锁mu。在每个goroutine中,在对slice进行写操作前调用mu.Lock()获取锁,在操作完成后调用mu.Unlock()释放锁。这样可以保证同一时间只有一个goroutine能够对slice进行写操作,从而避免了竞态条件。

需要注意的是,虽然slice本身是并发安全的,但是对slice中元素的修改仍然需要保证并发安全。如果多个goroutine同时对同一个slice中的同一个元素进行写操作,仍然可能会导致竞态条件。在这种情况下,可以使用互斥锁或其他并发原语来保证对元素的并发访问的安全性

go slice并发安全吗

原文地址: https://www.cveoy.top/t/topic/iWlh 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录