当前位置:网站首页>GO语言-锁操作
GO语言-锁操作
2022-06-25 15:39:00 【一边学习一边哭】
概述
sync包文档:Package sync - The Go Programming Language
sync包提供了基本同步的操作,如互斥锁等。除了Once和 WaitGroup之外,大多数类型都是提供低级库例程使用的。而更高级的的同步最好是通过channel和通信来完成。
互斥锁 Mutex
互斥锁比较暴力,当一个goroutine获得了互斥锁之后,其他的goroutine只能等待释放锁。
使用互斥锁时,对资源操作完一定要解锁,否则程序会死锁。建议使用defer语句来解锁。
//定义互斥锁对象
var mutex_name sync.Mutex
//上锁
mutex_name.Lock()
//解锁
mutex_name.Unlock()同样是的火车站售票问题,我们看一下通过互斥锁解决临界资源问题的效果
//车票余量
var tickets = 5
//定义同步等待组
var wg sync.WaitGroup
//定义互斥锁对象
var mutex sync.Mutex
func main() {
wg.Add(3)
go saleTickets("1号售票口")
go saleTickets("2号售票口")
go saleTickets("3号售票口")
wg.Wait()
}
func saleTickets(name string) {
for {
mutex.Lock()
if tickets > 0 {
fmt.Printf("车票剩余:%v, %v售出\n", tickets, name)
tickets--
time.Sleep(1 * time.Second)
} else {
mutex.Unlock()
fmt.Println("车票已售罄...")
wg.Done()
break
}
mutex.Unlock()
}
}
读写锁 RWMutex
读写锁和普通的互斥锁不同的是,它是一种专门针对读操作和写操作的互斥锁。
读写锁同一时刻允许有多个读操作在进行,但在同一时刻只允许有一个写操作在进行。并且在某一个写操作进行过程中,读操作也是不可以进行的。所以说,读写锁对于读操作可以同时并发,但是对于写操作是完全互斥的。
//定义读写锁锁对象
var rwmutex_name sync.RWMutex
//读锁
rwmutex_name.RLock
//读解锁
rwmutex_name.RUnlock
//写锁
rwmutex_name.Lock
//写解锁
rwmutex_name.Unlock读写锁我们就不进行示例的展示了,因为和上面互斥锁展示的示例效果应该差别不大。
对写锁实际解决的问题是,使用互斥锁带来并发能力降低的问题。因为互斥锁不论读操作还是写操作都会阻塞,程序从并发变成了串行。
而实际上对于不会对临界资源产生修改的读操作,我们是不需要阻塞的;只有对临界资源需要修改的写操作,我们才需要阻塞。所以读写锁就是为了提高程序加锁时的并发能力。
边栏推荐
- Built in methods for data types
- Linux-MySQL数据库之高级SQL 语句一
- Sword finger offer 04 Find in 2D array
- 什么是NFT数字藏品?
- golang使用mongo-driver操作——增(进阶)
- leetcode-8. 字符串转换整数 (atoi)
- Client development (electron) system level API usage
- VectorDraw Developer Framework 10.1001 Crack
- Converting cifar10 datasets
- MySQL modify field statement
猜你喜欢

VectorDraw Developer Framework 10.1001 Crack

Stop "outsourcing" Ai models! The latest research finds that some "back doors" that undermine the security of machine learning models cannot be detected

The release of autok3s v0.5.0 continues to be simple and friendly

Binocular 3D perception (I): preliminary understanding of binocular

《睡眠公式》:怎么治睡不好?
Take you to the open source project of smart home: the preliminary configuration of zhiting home cloud and home assistant+ homebridge
Time wheel and implementation analysis of time wheel in go zero

Asynchronous processing of error prone points
Desktop development (Tauri) opens the first chapter

Programmer vs hacker thinking | daily anecdotes
随机推荐
揭秘GaussDB(for Redis):全面对比Codis
免费送书啦!火遍全网的AI给老照片上色,这里有一份详细教程!
分享自己平时使用的socket多客户端通信的代码技术点和软件使用
f_read 函数[通俗易懂]
Rxjs TakeUntil 操作符的学习笔记
Deep learning pytorch cifar10 dataset training "suggestions collection"
数据存储和传输文件之XML使用和解析详解
合宙Air32F103CBT6開發板上手報告
Golang uses Mongo driver operation - increase (Advanced)
Webgl and webgpu comparison [4] - uniform
数据类型的内置方法
加载本地cifar10 数据集
Native JS dynamically add elements
What are the reasons why the game industry needs high defense servers?
Introduction to database transactions
李飞飞团队将ViT用在机器人身上,规划推理最高提速512倍,还cue了何恺明的MAE
地理位置数据存储方案——Redis GEO
Free books! AI across the Internet paints old photos. Here is a detailed tutorial!
TFIDF and BM25
NFT元宇宙发展能做什么?