Go组件库总结之无等待锁
本篇文章我们用Go封装一个无等待锁库。文章参考自:https://github.com/brewlin/net-protocol
1.锁的封装
type Mutex struct {
v int32
ch chan struct{}
}
2.锁的初始化
func (m *Mutex) Init() {
m.v = 1
m.ch = make(chan struct{}, 1)
}
3.等待锁
如果没有拿到锁值,将会阻塞在信道上。
func (m *Mutex) Lock() {
if atomic.AddInt32(&m.v, -1) == 0 {
return
}
for {
if v := atomic.LoadInt32(&m.v); v >= 0 && atomic.SwapInt32(&m.v, -1) == 1 {
return
}
<-m.ch
}
}
4.无等待锁
如果没有拿到锁值,会直接返回。
func (m *Mutex) TryLock() bool {
v := atomic.LoadInt32(&m.v)
if v <= 0 {
return false
}
return atomic.CompareAndSwapInt32(&m.v, 1, 0)
}
5.释放锁
释放锁时,向信道发送值以唤醒阻塞的协程。
func (m *Mutex) Unlock() {
if atomic.SwapInt32(&m.v, 1) == 0 {
return
}
select {
case m.ch <- struct{}{}:
default:
}
}
6.使用示例
通过对上锁时机的控制,我们让GetCount()直接返回了-1,实现了无等待锁。
var (
count int
countGuard *Mutex
)
func GetCount() int {
if countGuard.TryLock() {
countGuard.Unlock()
return count
} else {
return -1
}
}
func SetCount(c int) {
countGuard.Lock()
time.Sleep(time.Second * 2)
count = c
countGuard.Unlock()
}
func main() {
countGuard = new(Mutex)
countGuard.Init()
go SetCount(1)
time.Sleep(time.Second)
fmt.Println(GetCount())
}
Go组件库总结之无等待锁的更多相关文章
- java高并发程序设计模式-并发级别:阻塞、无障碍、无锁、无等待【转载】
一般认为并发可以分为阻塞与非阻塞,对于非阻塞可以进一步细分为无障碍.无锁.无等待,下面就对这几个并发级别,作一些简单的介绍. 1.阻塞 阻塞是指一个线程进入临界区后,其它线程就必须在临界区外等待,待进 ...
- 如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源
1.前言 关于微信内部正在使用的网络层封装库Mars开源的消息,1个多月前就已满天飞(参见<微信Mars:微信内部正在使用的网络层封装库,即将开源>),不过微信团队没有失约,微信Mars ...
- HslCommunication组件库使用说明
一个由个人开发的组件库,携带了一些众多的功能,包含了数据网络通信,文件上传下载,日志组件,PLC访问类,还有一些其他的基础类库. nuget地址:https://www.nuget.org/packa ...
- 【转】如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源
网上看到关于微信官方的跨平台跨业务的终端基础组件Mars的介绍文章,转载这这里.源代码: https://github.com/Tencent/mars作者:男人链接:https://zhuanlan ...
- Java HTTP 组件库选型看这篇就够了
最近项目需要使用 Java 重度调用 HTTP API 接口,于是想着封装一个团队公用的 HTTP client lib. 这个库需要支持以下特性: 连接池管理,包括连接创建和超时.空闲连接数控制.每 ...
- 免费开源的 .NET 分布式组件库 Exceptionless Foundatio
前言 在互联网时代,分布式应用.系统变得越来越多,我们在使用 .Net 技术构建分布式系统的时候,需要使用到一些组件或者是助手库来帮助我们提高生产力以及应用程序解耦,但是纵观.Net圈,能够符合要求的 ...
- HslCommunication组件库使用说明 (转载)
一个由个人开发的组件库,携带了一些众多的功能,包含了数据网络通信,文件上传下载,日志组件,PLC访问类,还有一些其他的基础类库. nuget地址:https://www.nuget.org/packa ...
- beeshell —— 开源的 React Native 组件库
介绍 beeshell 是一个 React Native 应用的基础组件库,基于 0.53.3 版本,提供一整套开箱即用的高质量组件,包含 JavaScript(以下简称 JS)组件和复合组件(包含 ...
- 使用自定义验证组件库扩展 Windows 窗体
使用自定义验证组件库扩展 Windows 窗体 1(共 1)对本文的评价是有帮助 - 评价此主题 发布日期 : 8/24/20 ...
- 用JAVA实现无等待数据库连接池
我们都知道数据库连接是一种有限和非常昂贵的应用资源,怎样对这些资源进行高效的管理,能有效的改善整个系统的性能和健壮性.数据库连接池正是针对这个问题而提出来的. 数据库连接负责分配.释放和管理数据库连接 ...
随机推荐
- C#获取html标签内容的方法
C# 获取html标签内容的方法: /// <summary> /// 获取html网页标签内容 /// 例如:<span class="index_infoItem__E ...
- 【多线程与高并发】- synchronized锁的认知
synchronized锁的认知 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 目录 s ...
- centos7设置python路径
直接在命令行运行.py 文件: [clouder@ana53 common]$ python3 driver.py Traceback (most recent call last): File &q ...
- java环境变量配置-最新版
安装 百度"java下载"进入官网下载最新版,闭着眼睛安装: 配置jre 因java11以上不自带jre,需要我们自己配置,配置如下: # 终端进入jdk所在的目录后执行 bin\ ...
- Jetpack Compose学习(11)——Navigation页面导航的使用
原文:Jetpack Compose学习(11)--Navigation页面导航的使用 - Stars-One的杂货小窝 在Android原生的View开发中的,也是有Navigation,原生我之后 ...
- knock:端口敲门服务
knock:端口敲门服务 端口敲门服务,即:knockd服务.该服务通过动态的添加iptables规则来隐藏系统开启的服务,使用自定义的一系列序列号来"敲门",使系统开启需要访问的 ...
- 吐血整理!2万字Java基础面试题(带答案)请收好!
熬夜整理了这么多年来的Java基础面试题,欢迎学习收藏,手机上可以点击这里,效果更佳https://mp.weixin.qq.com/s/ncbEQqQdJo0UaogQSgA0bQ 1.1 Hash ...
- PostgreSQL 并行计算算法,参数,强制并行度设置
一.优化器并行计算的并行度计算方法 1.总worker进程数 postgres=# show ; max_worker_processes ---------------------- 128 (1 ...
- 世界UTC时间时区对照图
- YML
一.YML语法 1.约定 k: v 表示键值对关系,冒号后面必须有一个空格 使用空格的缩进表示层级关系,空格数目不重要,只要是左对齐的一列数据,都是同一个层级的 大小写敏感 缩进时不允许使用Tab键, ...