From 3c356f488ae469bf492234bc1738289daac957f2 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 9 Jul 2024 00:38:00 +0800 Subject: [PATCH] rwmutex finished --- .idea/vcs.xml | 1 - sync/mutex.go | 1 + sync/rwmutex.go | 53 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 sync/rwmutex.go diff --git a/.idea/vcs.xml b/.idea/vcs.xml index a9aa77a..94a25f7 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -2,6 +2,5 @@ - \ No newline at end of file diff --git a/sync/mutex.go b/sync/mutex.go index a5c2295..ef262e6 100644 --- a/sync/mutex.go +++ b/sync/mutex.go @@ -6,6 +6,7 @@ import ( ) // 互斥锁 +// 保证同一时间只有一个goroutine进入临界区,其他的goroutine在等待锁的释放,多个goroutine等待同一个锁的时候,唤醒的策略是随机的 var x = 0 var wg sync.WaitGroup diff --git a/sync/rwmutex.go b/sync/rwmutex.go new file mode 100644 index 0000000..234a941 --- /dev/null +++ b/sync/rwmutex.go @@ -0,0 +1,53 @@ +package main + +import ( + "fmt" + "sync" + "time" +) + +// 读写互斥锁,读的时候远远大于写的场景 +// rwlock +// 当读的时候加读锁,写的时候加写锁。和互斥锁相比性能差很多 +// 当持有写锁,所有的goroutine都需要等待写锁解锁不能读也不能写,当持有读锁,所有goroutine仍然能够读访问共享资源,但不允许写 +var ( + v = 0 + locker sync.Mutex + w sync.WaitGroup + rwlocker sync.RWMutex +) + +func read() { + defer w.Done() + locker.Lock() + //rwlocker.RLock() + fmt.Println(v) + time.Sleep(time.Millisecond * 1) + locker.Unlock() + //rwlocker.RUnlock() +} + +func write() { + defer w.Done() + locker.Lock() + //rwlocker.Lock() + v += 1 + time.Sleep(time.Millisecond * 5) + locker.Unlock() + //rwlocker.Unlock() +} + +func main() { + start := time.Now() + for i := 0; i < 10; i++ { + w.Add(1) + go write() + } + time.Sleep(time.Second) + for i := 0; i < 1000; i++ { + w.Add(1) + go read() + } + w.Wait() + fmt.Println(time.Now().Sub(start)) +}