golang的乐观锁与悲观锁
基本概念
-
乐观锁和悲观锁是两种思想,用于解决并发场景下的数据竞争问题。
-
乐观锁:乐观锁在操作数据时非常乐观,认为别人不会同时修改数据。因此乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据:如果别人修改了数据则放弃操作,否则执行操作。
-
悲观锁:悲观锁在操作数据时比较悲观,认为别人会同时修改数据。因此操作数据时直接把数据锁住,直到操作完成后才会释放锁;上锁期间其他人不能修改数据。
package main
import (
"fmt"
"sync"
"sync/atomic"
"time"
)
func IncreValue1() {
value1++
}
func IncreValue2() {
atomic.AddInt32(&value2, 1)
}
func IncreValue3() {
lock.Lock()
value3++
lock.Unlock()
}
var value1, value2, value3 int32
var lock sync.Mutex
func main() {
//开启1000个线程,并执行自增操作
for i := 0; i < 1000; i++ {
go IncreValue1()
go IncreValue2()
go IncreValue3()
}
//打印结果
time.Sleep(1000)
fmt.Println("线程不安全:", value1)
fmt.Println("乐观锁:", value2)
fmt.Println("悲观锁:&