go juc 线程中的子类

1.go test() 主死随从

package mainimport ("fmt""strconv""time"
)func test() {for i := 1; i <= 10; i++ {fmt.Println("hello " + strconv.Itoa(i))//阻塞time.Sleep(time.Second)}
}
func main() {//开启协程go test()for i := 1; i <= 10; i++ {fmt.Println(" main msg " + strconv.Itoa(i))//阻塞time.Sleep(time.Second)}}

2.共享i 读写混乱

func test() {for i := 1; i <= 10; i++ {fmt.Println("hello " + strconv.Itoa(i))//阻塞time.Sleep(time.Second)}
}
func main() {//开启协程for i := 0; i < 4; i++ {//共享i 读写混乱/*go func() {fmt.Println("hello ", strconv.Itoa(i))}()*///匿名 +闭包 ==解决共享i 混乱的问题go func(n int) {fmt.Println("hello ", strconv.Itoa(n))}(i)}time.Sleep(time.Second)}

3.协程执行完退出WaitGroup

var wg sync.WaitGroupfunc main() {//开启协程for i := 0; i < 5; i++ {//共享i 读写混乱/*go func() {fmt.Println("hello ", strconv.Itoa(i))}()*/wg.Add(1)//匿名 +闭包 ==解决共享i 混乱的问题go func(n int) {fmt.Println("hello ", strconv.Itoa(n))wg.Done()}(i)}//阻塞主线程wg.Wait()//time.Sleep(time.Second)}

4.加减操作造成数据混乱

package mainimport ("fmt""sync"
)var wg sync.WaitGroup
var totalNum int// 增加锁机制
var lock sync.Mutexfunc add() {defer wg.Done()for i := 0; i < 10000; i++ {//lock.Lock()totalNum = totalNum + 1//lock.Unlock()}
}
func sub() {defer wg.Done()for i := 0; i < 10000; i++ {//lock.Lock()totalNum = totalNum - 1//lock.Unlock()}
}func main() {//开启协程wg.Add(2)go add()go sub()//阻塞主线程wg.Wait()//time.Sleep(time.Second)fmt.Println(totalNum)}

5.增加锁机制sync.Mutex互斥锁

package mainimport ("fmt""sync"
)var wg sync.WaitGroup
var totalNum int// 增加锁机制
var lock sync.Mutexfunc add() {defer wg.Done()for i := 0; i < 10000; i++ {lock.Lock()totalNum = totalNum + 1lock.Unlock()}
}
func sub() {defer wg.Done()for i := 0; i < 10000; i++ {lock.Lock()totalNum = totalNum - 1lock.Unlock()}
}func main() {//开启协程wg.Add(2)go add()go sub()//阻塞主线程wg.Wait()//time.Sleep(time.Second)fmt.Println(totalNum)}

6.读写锁(读多写少)sync.RWMutex

package mainimport ("fmt""sync""time"
)var wg sync.WaitGroup
var totalNum int// 增加锁机制
var lock sync.RWMutexfunc read() {defer wg.Done()lock.RLock()fmt.Println("读数据")time.Sleep(time.Second)lock.RUnlock()
}
func write() {defer wg.Done()lock.Lock()fmt.Println("写数据")time.Sleep(time.Second * 10)lock.Unlock()
}func main() {//开启协程wg.Add(6)for i := 0; i < 5; i++ {go read()}go write()//阻塞主线程wg.Wait()//time.Sleep(time.Second)fmt.Println(totalNum)}

7.管道


func main() {//定义一个管道var intChan chan intintChan = make(chan int, 3)fmt.Println("管道的引用类型 ", intChan)//先管道存储数据intChan <- 10num := 20intChan <- num//从管道存储数据num1 := <-intChanfmt.Println(num1)num2 := <-intChanfmt.Println(num2)fmt.Println("管道的长度 ", len(intChan), "管道的容量", cap(intChan))}

8.管道关闭 不能写可以读

package mainimport "fmt"func main() {//定义一个管道var intChan chan intintChan = make(chan int, 3)fmt.Println("管道的引用类型 ", intChan)//先管道存储数据intChan <- 10num := 20intChan <- num//从管道存储数据num1 := <-intChanfmt.Println(num1)num2 := <-intChanfmt.Println(num2)//关闭管道close(intChan)//管道关闭 不能写可以读fmt.Println("管道的长度 ", len(intChan), "管道的容量", cap(intChan))}

9.管道的遍历 用for-range 

遍历前需要关闭管道

package mainimport "fmt"func main() {//定义一个管道var intChan chan intintChan = make(chan int, 100)fmt.Println("管道的引用类型 ", intChan)//先管道存储数据for i := 0; i < 99; i++ {intChan <- i}//关闭管道 遍历前需要关闭管道close(intChan)//从管道存储数据for v := range intChan {fmt.Println("value =", v)}//管道关闭 不能写可以读fmt.Println("管道的长度 ", len(intChan), "管道的容量", cap(intChan))}

10.读和写的协程通常操作一个管道

var wg sync.WaitGroupfunc writeDta(intChan chan int) {defer wg.Done()for i := 0; i <= 50; i++ {intChan <- ifmt.Println("写", i)time.Sleep(time.Second)}close(intChan)
}
func read(intChan chan int) {defer wg.Done()for v := range intChan {fmt.Println("read ", v)time.Sleep(time.Second)}
}func main() {//读和写的协程通常操作一个管道inChan := make(chan int, 50)wg.Add(2)go writeDta(inChan)go read(inChan)wg.Wait()}

11.读写管道

package mainimport ("fmt""sync"
)var wg sync.WaitGroupfunc main() {//读和写的协程通常操作一个管道//默认读写管道//inChan := make(chan int, 50)//声明一个只写的管道var intChanw chan<- intintChanw = make(chan<- int, 3)intChanw <- 20fmt.Println("intChan2 ", intChanw)//读管道var intChanR <-chan intif intChanR != nil {num1 := <-intChanRfmt.Println("read ", num1)}}

11.管道的阻塞

当管道只写入数据,没有读取,就会出现阻寒:

12

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/790612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何配置vite的proxy

1.前言 vite项目&#xff0c;本地开发环境可以通过配置proxy代理实现跨域请求。但是生产环境&#xff0c;该配置不生效&#xff0c;一般使用 nginx 转发&#xff0c;或者后端配置cors 2.解释 server: {port: 9000,proxy: { // 本地开发环境通过代理实现跨域&#xff0c;生产…

基于ssm的轻型卡车零部件销售平台(java项目+文档+源码)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的轻型卡车零部件销售平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 轻型卡车零部件销售平台…

C# 批量删除Excel重复项

当从不同来源导入Excel数据时&#xff0c;可能存在重复的记录。为了确保数据的准确性&#xff0c;通常需要删除这些重复的行。 手动查找并删除可能会非常耗费时间&#xff0c;而通过编程脚本则可以实现在短时间内处理大量数据。本文将提供一个使用C# 快速查找并删除Excel重复项…

【ArduinoQuartus】在小脚丫STEP CYC10上安装PulseRain Reindeer并在软核上运行基础功能

【Arduino&Quartus】在小脚丫STEP CYC10上安装PulseRain Reindeer并在软核上运行基础功能 一、将Reindeer软核下载到STEP CYC10&#xff08;一&#xff09;下载PulseRain Reindeer软核&#xff08;二&#xff09;配置Reindeer软核到开发板1.将sof文件转换为jic文件2.将jic文…

Centos7安装单机版Kafka

下载 链接&#xff1a;https://pan.baidu.com/s/1W8lVEF6Y-xlg6zr3l9QAbg?pwdhbkt 提取码&#xff1a;hbkt 上传到服务器/opt目录 安装 # kafka安装目录为 /opt/kafka cd /opt; mkdir kafka; mv kafka_2.13-2.7.0.tgz ./kafka;cd kafka; #解压 tar -zxvf kafka_2.13-2.7.0…

说一说Redis的Bitmaps和HyperLoLog?

本篇内容对应 “Redis高级数据类型”小节 和 “7.5 网站数据统计”小节 对应视频&#xff1a; Redis高级数据结构 网站数据统计 1 什么是UV和DAU&#xff1f; DAUUV英文全称Daily Active UserUnique Visotr中文全称日活跃用户量独立访客如何统计数据通过用户ID排重统计数据通…

上位机图像处理和嵌入式模块部署(qmacvisual图像清晰度)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 做过isp的同学都知道&#xff0c;图像处理里面有一个3A&#xff0c;即自动曝光、自动白平衡和自动对焦。其中自动对焦这个&#xff0c;就需要用输入…

绩效考核存在合理性、公平性、客观性吗?

目录 一、绩效考核流于形式&#xff1a;没有实际考核过 二、考核结果的确定: 主管一人说了算 三、考核结果&#xff1a; 与绩效奖金挂钩吗&#xff1f; 四、考核的滥用&#xff1a;成为公司排挤迫使员工离职的手段 五、公司说&#xff1a; 让你滚蛋&#xff0c;谁还会发你奖…

SpringBoot(48)-使用 SkyWalking 进行分布式链路追踪

Spring Boot&#xff08;48&#xff09;- 使用 SkyWalking 进行分布式链路追踪 介绍 在分布式系统中&#xff0c;了解各个服务之间的调用关系和性能表现是非常重要的。SkyWalking 是一款开源的分布式系统监控与分析平台&#xff0c;能够帮助我们实现分布式系统的链路追踪、性…

使用minikube安装使用单机版K8S(docker)

前置&#xff1a;作为一个开发&#xff0c;工作之余想玩一下k8s&#xff0c;但是搭建成本太高&#xff0c;所以就找到了minikube这个工具&#xff0c;快速搭建单机版k8s&#xff0c;下面是个人搭建流程&#xff0c;基于centos7&#xff0c;仅供参考。 1.下载kubectl&#xff0…

ES学习日记(十)-------Java操作ES之连接客户端

Elasticsearch有两种连接方式: transport、rest。transport 通过TCP方式访问ES(只支持iava)&#xff0c;rest 方式通过http API 访问ES(没有语言限制)。 ES官方建议使用Iest 方式&#xff0c;transport 在7.8 版本中不建议使用&#xff0c;在8.x的版本中废弃。你可以用Java客户…

Java23种设计模式

本文主要是对Java中一些常用的设计模式进行讲解 后期会进行不断的更新&#xff0c;欢迎浏览 23种设计模式 创建型模式&#xff0c;共五种&#xff1a;工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式。结构型模式&#xff0c;共七种&#xff1a;适配器模式、桥接…

使用 Flume 将 CSV 数据导入 Kafka:实现实时数据流

使用 Flume 将 CSV 数据导入 Kafka&#xff1a;实现实时数据流 文介绍了如何使用 Apache Flume 将 CSV 格式的数据从本地文件系统导入到 Apache Kafka 中&#xff0c;以实现实时数据流处理。通过 Flume 的配置和操作步骤&#xff0c;我们可以轻松地将数据从 CSV 文件中读取并发…

RT-Thread下使用NTP服务器获取时间并同步到硬件RTC

单片机:STM32F407VET6 实现功能:通过ntp服务器获取时间并同步到硬件RTC上 1.配置NTP相关参数 1.1打开netutils相关软件包 1.2 关闭软件RTC相关配置 参考资料:RT-Thread中使用NTP自动更新时间_rtthread ntp-CSDN博客 2.配置硬件RTC 2.1 在ENV里面使能硬件RTC 2.2使用STM32C…

日志服务 HarmonyOS NEXT 日志采集最佳实践

作者&#xff1a;高玉龙&#xff08;元泊&#xff09; 背景信息 随着数字化新时代的全面展开以及 5G 与物联网&#xff08;IoT&#xff09;技术的迅速普及&#xff0c;操作系统正面临前所未有的变革需求。在这个背景下&#xff0c;华为公司自主研发的鸿蒙操作系统&#xff08…

idea maven 打包 内存溢出 报 GC overhead limit exceeded -> [Help 1]

idea 使用maven打包 报GC overhead limit exceeded -> [Help 1] 解决方法&#xff1a; 打开settings -> 点开如同所示 将 vm Options 参数 设为 -Xmx8g

双链表算法库构建

v1.0 : 模仿贺利坚老师, 进行基本构建 贺老师链接:数据结构之自建算法库——双链表_双链表画法-CSDN博客 我的解析博客:双链表的存储结构_p (*q)->next;-CSDN博客 库函数: //(1)初始化双链表 void InitDoubleLinkList(DoubleLinkList *&L);//(2)输出双链表 void Dispal…

Pots(DFS BFS)

//新生训练 #include <iostream> #include <algorithm> #include <cstring> #include <queue> using namespace std; typedef pair<int, int> PII; const int N 205; int n, m; int l; int A, B, C; int dis[N][N];struct node {int px, py, op…

解决虚拟机centos8无法连接外网,ping: www.baidu.com: 未知的名称或服务

设置的虚拟机刚开还是好好的&#xff0c;改完hostname重启后就连不上网了 ping百度时显示未知的名称或服务。 1.找到虚拟机的IP(NAT模式的) 编辑-->虚拟网络编辑器 可以看到我的子网IP为192.168.47.0 2.编辑网络配置文件 vim /etc/sysconfig/network-scripts/ifcfg-XXXXX…

SpringCloud学习(1)-consul

consul下载安装及使用 1.consul简介 Consul是一种开源的、分布式的服务发现和配置管理工具&#xff0c;能够帮助开发人员构建和管理现代化的分布式系统。它提供了一套完整的功能&#xff0c;包括服务注册与发现、健康检查、KV存储、多数据中心支持等&#xff0c;可以帮助开发人…