栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

golang的乐观锁与悲观锁

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

golang的乐观锁与悲观锁

golang的乐观锁与悲观锁
  • 基本概念

基本概念
  1. 乐观锁和悲观锁是两种思想,用于解决并发场景下的数据竞争问题。

  2. 乐观锁:乐观锁在操作数据时非常乐观,认为别人不会同时修改数据。因此乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据:如果别人修改了数据则放弃操作,否则执行操作。

  3. 悲观锁:悲观锁在操作数据时比较悲观,认为别人会同时修改数据。因此操作数据时直接把数据锁住,直到操作完成后才会释放锁;上锁期间其他人不能修改数据。

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("悲观锁:", value2)
}

value1的值每次执行都小于1000,因为没有做任何线程安全的操作。
func AddInt32(addr *int32, delta int32) (new int32)

第一个参数是指针,是因为该函数需要获得到被操作值在内存中的存放位置(如果不是指针就是传值了),以便施加特殊的CPU指令(原子性是在硬件层面保证的)。

从另一个角度看,对于一个不能被取址的数值,我们是无法进行原子操作的。

  1. atomic.AddInt64、atomic.AddUint32,atomic.AddUint64,atomic.AddUintptr
  2. 除了支持这些类型外还有另外四种方法CompareAndSwapInt32,LoadInt32,StoreInt32,SwapInt32(比较并交换,载入(拿),存储(放),交换)

https://www.kancloud.cn/digest/batu-go/153537
http://ifeve.com/go-concurrency-atomic/

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/906820.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号