发布于2024-11-01 阅读(0)
扫一扫,手机访问
Golang中锁的原理及应用解析
2.1 互斥锁
互斥锁的基本原理是通过一个标志位来表示资源是否被锁定。当某个 goroutine 要访问被互斥锁保护的资源时,首先会尝试获取锁。如果锁已经被其他 goroutine 获取,那么当前 goroutine 就会被阻塞,直到锁被释放。当一个 goroutine 获取到锁之后就可以对资源进行操作,并且在完成操作后释放锁,以便其他 goroutine 获取锁。
下面是互斥锁的应用示例:
package main import ( "fmt" "sync" ) var count int var lock sync.Mutex func increase() { for i := 0; i < 100000; i++ { lock.Lock() count++ lock.Unlock() } } func main() { var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go func() { increase() wg.Done() }() } wg.Wait() fmt.Println("count:", count) }
在上述示例中,我们创建了一个互斥锁 lock
来保护全局变量 count
的读写操作。然后启动了10个 goroutine 来并发操作 count
变量,每个 goroutine 都会对 count
执行 100000 次加操作。最后输出 count
的值,我们会发现结果始终是 1000000,表明互斥锁确实保证了并发操作的正确性。
2.2 读写锁
读写锁是互斥锁的扩展,它允许多个 goroutine 同时读共享资源,并且保证在写资源时只能有一个 goroutine。读写锁可以提高并发处理读操作的效率。
下面是读写锁的应用示例:
package main import ( "fmt" "sync" "time" ) var count int var rwlock sync.RWMutex func read() { rwlock.RLock() defer rwlock.RUnlock() fmt.Println("read:", count) } func write() { rwlock.Lock() defer rwlock.Unlock() count = count + 1 fmt.Println("write:", count) } func main() { go read() go write() time.Sleep(time.Second) }
在上述示例中,我们创建了一个读写锁 rwlock
来保护全局变量 count
的读写操作。启动了两个 goroutine,其中一个进行读操作,另一个进行写操作。由于读操作可以同时进行,因此读操作会先执行,输出 read:
和 write:
的顺序可能不一样。但是我们可以确保写操作先执行,然后再进行读操作,以保证数据的正确性。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店