go的sync包学习
包含了sync.Mutex,sync.RWMutex,sync.Cond,sync.Map,sync.Once等demo
sync.Mutex
//讲解mutex
import ("fmt""math/rand""sync""time"
)type Toilet struct {m sync.Mutex
}
type Person struct {Name string
}var DateTime = "2006-01-02 15:04:05"var otherThing = []string{"唱歌", "跳舞", "修仙"}func main() {t := &Toilet{}wg := sync.WaitGroup{}wg.Add(5)for i := 0; i < 5; i++ {go func(i int, t *Toilet, wg *sync.WaitGroup) {p := Person{Name: fmt.Sprintf("%d 号", i),}p.InToiletLock(t, wg)}(i, t, &wg)}wg.Wait()}func (p *Person) InToiletLock(t *Toilet, wg *sync.WaitGroup) {defer wg.Done()t.m.Lock()i := rand.Intn(5)fmt.Printf("%s 上厕所时间 %v\n", p.Name, time.Now().Format(DateTime))time.Sleep(time.Duration(i) * time.Second)t.m.Unlock()
}
func (p *Person) InToiletUnLock(wg *sync.WaitGroup) {defer wg.Done()i := rand.Intn(5)fmt.Printf("%s 上厕所时间 %v\n", p.Name, time.Now().Format(DateTime))time.Sleep(time.Duration(i) * time.Second)
}

sync.RWMutex
package mainimport ("fmt""math/rand""sync""time"
)type Cinema struct {rw *sync.RWMutex
}type Person struct {Name string
}type Admin struct {Name string
}func main() {//example01()exmples2()
}func (p *Person) SitDown(wg *sync.WaitGroup) {defer wg.Done()fmt.Printf("%s 观众坐下!\n", p.Name)
}func (p *Person) StartWatch() {fmt.Printf("%s 开始观看!\n", p.Name)i := time.Duration(rand.Intn(5) + 1)time.Sleep(i * time.Second)fmt.Printf("%s 观看结束!\n", p.Name)
}func (p *Person) WatchMovie(c *Cinema, wg *sync.WaitGroup, b chan int) {c.rw.RLock()//先坐下p.SitDown(wg)<-b//看电影p.StartWatch()c.rw.RUnlock()
}func (a *Admin) ChangeMovie(c *Cinema, wg *sync.WaitGroup) {defer wg.Done()c.rw.Lock()fmt.Printf("所有观众看完电影,%s管理员切换影片\n", a.Name)c.rw.Unlock()
}
func example01() {c := &Cinema{rw: &sync.RWMutex{}}a := &Admin{Name: "超人"}b := make(chan int)wg := sync.WaitGroup{}wg.Add(10)for i := 0; i < 10; i++ {go func(i int, c *Cinema, wg *sync.WaitGroup, b chan int) {p := Person{Name: fmt.Sprintf("%d 号观众", i),}p.WatchMovie(c, wg, b)}(i, c, &wg, b)}wg.Wait()fmt.Printf("所有观众入座,开始播放电影\n")close(b)wg.Add(1)go func(wg *sync.WaitGroup) {a.ChangeMovie(c, wg)}(&wg)wg.Wait()
}type Desk struct {rw *sync.RWMutexSnacks int
}func (d *Desk) PlaceSnacks(wg *sync.WaitGroup) {defer wg.Done()d.rw.Lock()d.Snacks = 10time.Sleep(3 * time.Second)fmt.Printf("零食准备完毕...\n")d.rw.Unlock()
}
func (p *Person) GetSnacks(d *Desk, wg *sync.WaitGroup) {for !d.rw.TryRLock() {fmt.Printf("桌上没零食,%s 望眼欲穿\n", p.Name)time.Sleep(2 * time.Second)}d.rw.RUnlock()defer wg.Done()defer d.rw.Unlock()d.rw.Lock()if d.Snacks > 0 {fmt.Printf("%s 抢到零食,开心\n", p.Name)d.Snacks--return}fmt.Printf("%s 没抢到零食,难受\n", p.Name)
}
func exmples2() {d := Desk{rw: &sync.RWMutex{},}wg := sync.WaitGroup{}wg.Add(12)go d.PlaceSnacks(&wg)for i := 0; i < 11; i++ {p := Person{Name: fmt.Sprintf("%d 号猿猴", i),}go p.GetSnacks(&d, &wg)}wg.Wait()
}
sync.Cond
package main//sync.Cond进行学习import ("fmt""sync""time"
)var start = false
var done = falsefunc main() {wg := sync.WaitGroup{}wg.Add(10)m := &sync.Mutex{}c := sync.NewCond(m)for i := 0; i < 10; i++ {go Soliders(i, c, &wg)}go Waiter(c)Officer(c)wg.Wait()fmt.Println("所有大兵干完饭")CleanUp(c)time.Sleep(time.Second * 3)fmt.Println("打扫结束")
}func CleanUp(c *sync.Cond) {c.L.Lock()done = truec.L.Unlock()c.Signal()}
func Officer(c *sync.Cond) {fmt.Printf("长官准备中....\n")time.Sleep(time.Second * 5)c.L.Lock()start = truec.L.Unlock()c.Broadcast()
}func Soliders(i int, c *sync.Cond, wg *sync.WaitGroup) {defer wg.Done()c.L.Lock()fmt.Printf("大兵%d号等待干饭...\n", i)for !start {c.Wait()}fmt.Printf("大兵%d号开始干饭...\n", i)c.L.Unlock()
}func Waiter(c *sync.Cond) {c.L.Lock()for !done {c.Wait()}fmt.Println("用餐结束,开始打扫......")c.L.Unlock()return
}
sync.Map
func main() {m := make(map[int]int)for i := 0; i < 1000; i++ {go func(m map[int]int) {m[i] = i}(m)}
}func TestStore(t *testing.T) {var sum sync.Mapsum.Store("a", 1)//sum.Delete("a")val, ok := sum.Load("a")fmt.Println(val, ok)
}func TestLoadAndDelete(t *testing.T) {var smm sync.Mapsmm.Store("a", 1)val, loaded := smm.LoadAndDelete("a")fmt.Printf("value is %v,is exist %v \n", val, loaded)_, ok := smm.LoadAndDelete("a")fmt.Printf("value is ,is exist %v \n", ok)
}func TestLoadAndStore(t *testing.T) {var smm sync.Mapvalue, loaded := smm.LoadOrStore("a", 1)fmt.Printf("value is %v,is exist %v \n", value, loaded)value, loaded = smm.LoadOrStore("a", 2)fmt.Printf("value is %v,is exist %v \n", value, loaded)smm.Store("a", 3)value, loaded = smm.Load("a")fmt.Printf("value is %v,is exist %v \n", value, loaded)
}func TestRange(t *testing.T) {var smm sync.Mapfor i := 0; i < 10; i++ {go func(m *sync.Map, key int, value int) {m.Store(key, value)}(&smm, i, i)}time.Sleep(2 * time.Second)smm.Range(func(key, value interface{}) bool {fmt.Println(key, value)return true})
}
sync.pool
import ("bytes""log""net/http""runtime""sync""time"
)var pool = sync.Pool{New: func() interface{} { return new([]bytes.Buffer) }}func main() {var pool sync.Poolfor i := 0; i < 10; i++ {pool.Put(&http.Client{Timeout: time.Second * time.Duration(10),})}runtime.GC()runtime.GC()p := pool.Get()if p == nil {log.Fatal("p is nil")} else {pool.Put(p)}
}
sync.Once
package mainimport ("fmt""math/rand""sync""sync/atomic""testing""time"
)//主要涉及sync.Oncetype Config struct {Server stringPort int64
}var (config *Configonce OncePowerinitedConfig uint32
)type OncePower struct {sync.Mutexdone uint32
}func init() {rand.Seed(time.Now().UnixNano())
}
func (p *OncePower) Do(fun func() error) error {if atomic.LoadUint32(&p.done) == 0 {return p.doSlow(fun)}return nil
}func (o *OncePower) doSlow(fun func() error) error {o.Lock()defer o.Unlock()if o.done == 0 {err := fun()if err != nil {return err}atomic.StoreUint32(&o.done, 1)}return nil
}
func initConfig() error {//randInt := rand.Intn(6)//if randInt > 2 {// return errors.New("初始化失败了....")//}config = &Config{Server: "127.0.0.1",Port: 9999,}fmt.Println("init config....")if atomic.LoadUint32(&initedConfig) == 0 {atomic.StoreUint32(&initedConfig, 1)}return nil
}func ReadConfig(i int) *Config {fmt.Println("i >>>", i)err := once.Do(initConfig)fmt.Println("once err >>>", err)return config
}func TestSingleTon(t *testing.T) {wait := sync.WaitGroup{}for i := 0; i < 10; i++ {wait.Add(1)go func(i int) {defer wait.Done()_ = ReadConfig(i)}(i)}wait.Wait()
}func TestOnce(t *testing.T) {var once sync.OnceonceBody := func() {fmt.Println("only once")}done := make(chan bool)for i := 0; i < 10; i++ {go func() {once.Do(onceBody)done <- truefmt.Println("true done", i)}()}for i := 0; i < 10; i++ {<-done}
}相关文章:
go的sync包学习
包含了sync.Mutex,sync.RWMutex,sync.Cond,sync.Map,sync.Once等demo sync.Mutex //讲解mutex import ("fmt""math/rand""sync""time" )type Toilet struct {m sync.Mutex } type Person struct {Name string }var DateTime "2…...
互联网上常见的,ip地址泛播什么意思
互联网上常见的,ip地址泛播什么意思! 泛播通过将IP地址广播发送到网络中的所有设备,使得这些设备能够接收到相关信息。例如,DHCP服务器在局域网中广播提供IP地址的请求,以便新设备能够获取一个可用的IP地址。此外&…...
Linux/C高级(精讲)----shell结构语句、shell数组
shell脚本 功能性语句 test 可测试对象三种:字符串 整数 文件属性 每种测试对象都有若干测试操作符 1)字符串的测试: s1 s2 测试两个字符串的内容是否完全一样 s1 ! s2 测试两个字符串的内容是否有差异 -z s1 测试s1 字符串的长度是…...
14.kafka开机自启动配置
要在Linux(RHEL7.7)系统中设置kafka开机自启动,可以创建一个系统服务单元文件。以下是为详细配置部署,假设你已经安装了kafka并且可以通过kafka-server-start.sh命令启动它。 1.进入/lib/systemd/system目录 命令: cd /lib/systemd/system…...
11 享元(Flyweight)模式
享元模式 1.1 分类 (对象)结构型 1.2 提出问题 做一个车管所系统,将会产生大量的车辆实体,如果每一个实例都保存自己的所有信息,将会需要大量内存,甚至导致程序崩溃。 1.3 解决方案 运用共享技术有效…...
PHP JSON操作指南
PHP JSON操作指南 概述 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。PHP作为一门流行的服务器端脚本语言,支持对JSON数据进行读取、编写和解析。本文将…...
【学习笔记】计算机图形学的几何数学基础知识
3D坐标系 左手系和右手系 点 x,y,z与w(齐次坐标) 矩阵 第一个下标表示行号,第二个下标表示列号。矩阵乘法不满足交换律矩阵乘法=矩阵合并一个矩阵乘以它的逆矩阵=单位矩阵变化矩阵 平移矩阵 缩放矩阵 除了可以缩放, 还可以利用缩放,在给定右手系的情况确定左手系…...
Python因为网络原因安装依赖库报错
现象 在终端运行以下指令 pip install pyautogui pillow keyboard 出现报错,终端信息如下: PS D:\code\Python> pip install pyautogui pillow keyboard Collecting pyautoguiUsing cached PyAutoGUI-0.9.54.tar.gz (61 kB)Installing build depe…...
什么是卸荷器?风力发电为什么要用卸荷器
目前市场上,那些功率低于400W的小型风力发电机,普遍缺乏刹车、稳速或限速机制。只要有足够的风力,发电机便会开始转动并产生电力。风力越强,转速就越快,这可能导致发电机因转速过高而损坏,甚至发生风机头飞…...
SQL Server详细使用教程(包含启动SQL server服务、建立数据库、建表的详细操作) 非常适合初学者
SQL Server详细使用教程(包含启动SQL server服务、建立数据库、建表的详细操作) 非常适合初学者 文章目录 目录 前言 一、启动SQL server服务的三种方法 1.不启动SQL server服务的影响 2.方法一:利用cmd启动SQL server服务 3.方法二:利用SQL Serv…...
大数据学习之Spark分布式计算框架RDD、内核进阶
一.RDD 28.RDD_为什么需要RDD 29.RDD_定义 30.RDD_五大特性总述 31.RDD_五大特性1 32.RDD_五大特性2 33.RDD_五大特性3 34.RDD_五大特性4 35.RDD_五大特性5 36.RDD_五大特性总结 37.RDD_创建概述 38.RDD_并行化创建 演示代码: // 获取当前 RDD 的分区数 Since ( …...
Unity 加载OSGB(webgl直接加载,无需转换格式!)
Unity webgl加载倾斜摄影数据 前言效果图后续不足 前言 Unity加载倾斜摄影数据,有很多的插件方便好用,但是发布到网页端均失败,因为webgl 的限制,IO读取失效。 前不久发现一个开源项目: UnityOSGB-main 通过两种方式在 Unity 中…...
tcp/ip网络协议,tcp/ip网络协议栈
TCP/IP网络协议和TCP/IP网络协议栈是互联网通信的基石,它们定义了电子设备如何连入因特网以及数据如何在它们之间传输的标准。以下是对TCP/IP网络协议和TCP/IP网络协议栈的详细解释: 一、TCP/IP网络协议 TCP/IP(Transmission Control Proto…...
【Debug】the remote host closed the connection错误信息分析
出现的情况说明:QT软件。刚开始都可以连接成功 之后连接 断开几次 就会出现连接失败 错误信息是the remote host closed the connection。the remote host closed the connection广泛原因分析 这个错误通常意味着远端 STM32 服务器主动关闭了连接。可能的原因包括&a…...
SpringBoot扩展篇:@Scope和@Lazy源码解析
SpringBoot扩展篇:Scope和Lazy源码解析 1. 研究主题及Demo2. 注册BeanDefinition3. 初始化属性3.1 解决依赖注入3.2 创建代理 ContextAnnotationAutowireCandidateResolver#getLazyResolutionProxyIfNecessary3.3 代理拦截处理3.4 单例bean与原型bean创建的区别 4. …...
“AI隐患识别系统,安全多了道“智能护盾”
家人们,在生活和工作里,咱们都知道安全那可是头等大事。不管是走在马路上,还是在工厂车间忙碌,又或是住在高楼大厦里,身边都可能藏着一些安全隐患。以前,发现这些隐患大多靠咱们的眼睛和经验,可…...
通向AGI之路:人工通用智能的技术演进与人类未来
文章目录 引言:当机器开始思考一、AGI的本质定义与技术演进1.1 从专用到通用:智能形态的范式转移1.2 AGI发展路线图二、突破AGI的五大技术路径2.1 神经符号整合(Neuro-Symbolic AI)2.2 世界模型架构(World Models)2.3 具身认知理论(Embodied Cognition)三、AGI安全:价…...
论文阅读:InstanceDiffusion: Instance-level Control for Image Generation
CVPR2024文章 摘要: 文本到图像扩散模型产生高质量的图像,但不提供对图像中单个实例的控制。我们引入了InstanceDiffusion,它将精确的实例级控制添加到文本到图像扩散模型中。InstanceDiffusion 支持每个实例的自由形式的语言条件ÿ…...
7.攻防世界 wzsc_文件上传
打开题目页面如下 上传了一张带有木马的图片 返回的页面是空白的,不过路径变了 猜测存在根目录/upload 也可以通过dirsearch扫描根目录 命令: dirsearch -u http://61.147.171.105:65024/ -e* 终于得到了上传的文件的信息 但是测试发现.php文件以及.…...
以为是响应式对象丢失导致数据没有回显
背景:之前ruoyi生成的vue2代码, <el-form ref“form”,后面我改成vue3的写法,没有实例化form, 在vue3中是需要定义const form ref(); 导致点击了修改后,页面弹框显示出来,数据没有回显。 一直…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
用鸿蒙HarmonyOS5实现国际象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的国际象棋小游戏的完整实现代码,使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├── …...
C++11 constexpr和字面类型:从入门到精通
文章目录 引言一、constexpr的基本概念与使用1.1 constexpr的定义与作用1.2 constexpr变量1.3 constexpr函数1.4 constexpr在类构造函数中的应用1.5 constexpr的优势 二、字面类型的基本概念与使用2.1 字面类型的定义与作用2.2 字面类型的应用场景2.2.1 常量定义2.2.2 模板参数…...
