sync.RWMutex
是 Go 语言标准库 sync
包中提供的一种同步原语,全称为读写互斥锁(Read-Write Mutex)。它设计用于处理读多写少的并发场景,相较于传统的互斥锁(如 sync.Mutex
)能更高效地管理对共享资源的访问。
在结构体 SliceStack
中嵌入 sync.RWMutex
,可以让该结构体的实例能够安全地在多个goroutine中进行读写操作。具体功能如下:
-
读写分离:
- 读取: 当有goroutine想要读取共享资源(如
arr
)时,可以调用RWMutex
的RLock()
方法获取读锁。读锁允许多个goroutine同时读取数据,而不会相互阻塞。 - 写入: 当有goroutine需要修改共享资源时,应调用
Lock()
方法获取写锁。写锁独占,一旦某个goroutine持有写锁,其他所有试图获取读锁或写锁的goroutine都会被阻塞,直到写锁释放。
- 读取: 当有goroutine想要读取共享资源(如
-
性能优势:在读操作远多于写操作的场景下,
RWMutex
相比普通的Mutex
能显著提高并发性能,因为它允许并发读取,减少了不必要的阻塞。 -
使用方法:
- 加读锁:
RWMutex.RLock()
,读完后需调用RWMutex.RUnlock()
释放读锁。 - 加写锁:
RWMutex.Lock()
,写操作完成后调用RWMutex.Unlock()
释放写锁。
- 加读锁:
type SliceStack struct {
arr []interface{}
stackSize int
sync.RWMutex
}
在 SliceStack
结构体中,通过嵌入 sync.RWMutex
,可以保护对 arr
的并发访问。例如,在执行任何读取 arr
的操作前调用 RWMutex.RLock()
,并在操作完成后调用 RWMutex.RUnlock()
;在进行写操作(如 push/pop)前则使用 RWMutex.Lock()
和相应的 RWMutex.Unlock()
。这样可以确保任何时候只有一个写操作可以进行,但多个读操作可以并行执行。