go juc 线程中的子类

1.go test() 主死随从

package main

import (
	"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.WaitGroup

func 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 main

import (
	"fmt"
	"sync"
)

var wg sync.WaitGroup
var totalNum int

// 增加锁机制
var lock sync.Mutex

func 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 main

import (
	"fmt"
	"sync"
)

var wg sync.WaitGroup
var totalNum int

// 增加锁机制
var lock sync.Mutex

func 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)

}

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

package main

import (
	"fmt"
	"sync"
	"time"
)

var wg sync.WaitGroup
var totalNum int

// 增加锁机制
var lock sync.RWMutex

func 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 int
	intChan = make(chan int, 3)
	fmt.Println("管道的引用类型 ", intChan)
	//先管道存储数据
	intChan <- 10
	num := 20
	intChan <- num

	//从管道存储数据
	num1 := <-intChan
	fmt.Println(num1)
	num2 := <-intChan
	fmt.Println(num2)

	fmt.Println("管道的长度 ", len(intChan), "管道的容量", cap(intChan))

}

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

package main

import "fmt"

func main() {
	//定义一个管道
	var intChan chan int
	intChan = make(chan int, 3)
	fmt.Println("管道的引用类型 ", intChan)
	//先管道存储数据
	intChan <- 10
	num := 20
	intChan <- num

	//从管道存储数据
	num1 := <-intChan
	fmt.Println(num1)
	num2 := <-intChan
	fmt.Println(num2)

	//关闭管道
	close(intChan)
	//管道关闭 不能写可以读
	fmt.Println("管道的长度 ", len(intChan), "管道的容量", cap(intChan))

}

9.管道的遍历 用for-range 

遍历前需要关闭管道

package main

import "fmt"

func main() {
	//定义一个管道
	var intChan chan int
	intChan = 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.WaitGroup

func writeDta(intChan chan int) {
	defer wg.Done()
	for i := 0; i <= 50; i++ {
		intChan <- i
		fmt.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 main

import (
	"fmt"
	"sync"
)

var wg sync.WaitGroup

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

}

11.管道的阻塞

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

12

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用pip安装geopandas(24.4更新)

geopandas是我们用Python进行地理分析常用的库&#xff0c;在数据处理、分析、制图等场景中有着极为广泛的应用&#xff0c;但是在安装过程中会出现各种问题。​geopandas的安装方式有很多&#xff0c;今天我们选取较为简单的pip来进行geopandas的安装。 ​首先&#xff0c;我…

Java多态世界(day18)

多态&#xff1a;重写的方法调用和执行 1.静态绑定&#xff1a;编译器在父类中找方法&#xff0c;如&#xff1a; 上面的eat&#xff08;&#xff09;方法是先在父类中找方法&#xff0c;父类没有的话&#xff0c;就算子类有编译也会报错。&#xff08;如果引用方法在父类中存…

深度学习:神经网络模型的剪枝和压缩简述

深度学习的神经网路的剪枝和压缩&#xff0c;大致的简述&#xff0c; 主要采用&#xff1a; network slimming&#xff0c;瘦身网络... 深度学习网络&#xff0c;压缩的主要方式&#xff1a; 1.剪枝&#xff0c;nerwork pruing&#xff0c; 2.稀疏表示&#xff0c;sparse rep…

React + 项目(从基础到实战) -- 第三期

react内置hooks useState 如何让页面动起来(实时更新) import React,{FC,useState} from "react";const Demo:FC()>{let count0; //普通js变量无法触发组件更新function add(){count;console.log("count: ",count);}return <div><button onCl…

(免费分享)基于微信小程序自助停取车收费系统

本项目的开发和制作主要采用Java语言编写&#xff0c;SpringBoot作为项目的后端开发框架&#xff0c;vue作为前端的快速开发框架&#xff0c;主要基于ES5的语法&#xff0c;客户端采用微信小程序作为开发。Mysql8.0作为数据库的持久化存储。 获取完整源码&#xff1a; 大家点赞…

基于SpringBoot的“简历系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“简历系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 管理员登录界面图 用户管理界面图 简历模板管理界面图…

Ubuntu Desktop 安装有道词典

Ubuntu Desktop 安装有道词典 1. 有道词典2. Installation2.1. 解压 deb 包到 youdao 目录2.2. 解压 deb 包中的 control 信息 (包的依赖写在该文件里面)2.3. 编辑 control 文件&#xff0c;删除依赖里面的 gstreamer0.10-plugins-ugly2.4. 创建 youdaobuild 目录&#xff0c;重…

数据结构—红黑树

红黑树介绍 红黑树&#xff08;Red Black Tree&#xff09;是一种自平衡二叉查找树。由于其自平衡的特性&#xff0c;保证了最坏情形下在 O(logn) 时间复杂度内完成查找、增加、删除等操作&#xff0c;性能表现稳定。 在 JDK 中&#xff0c;TreeMap、TreeSet 以及 JDK1.8 的 …

2024-04-03 NO.4 Quest3 手势追踪抓取物体

文章目录 1 手势抓取方式1.1 Hand Grab1.2 Touch Hand Grab1.3 Distance Hand Grab 2 HandGrabExamples 示例场景2.1 Interactor 对象2.2 Interactable 对象2.2.1 父子结构2.2.2 “Hand Grab lnteractable” 脚本2.2.3 “Move Towards Target Provider” 脚本2.2.4 其他 Moveme…

C#编写MQTT客户端软件

主要参考C#MQTT编程06--MQTT服务器和客户端(winform版)_c#mqttserver-CSDN博客 但由于使用的.NET版本和MQTT库版本存在差异&#xff0c;因此有些不同。 MQTT协议内容在此不做描述&#xff0c;仅介绍VS使用C#的实现过程。本次使用VS2015&#xff0c;.netframwork4.6。 C#语言本身…

LeetCode每日一题之专题一:双指针 ——复写零

复写零OJ链接&#xff1a;1089. 复写零 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 解法&#xff08;原地复写-双指针&#xff09;&#xff1a; 算法思路&#xff1a; 如果「从前向后」进⾏原地复写操作的话&#xff0c;由于 0 的出现会复写两次&#xff0c;导致…

无法打开pycharm虚拟环境

问题&#xff1a;在pycharm的terminal中执行pip命令&#xff0c;但是下载的包没有安装到该项目的虚拟环境中。 激活虚拟环境&#xff0c;打开terminal&#xff0c;执行myenv\Scripts\activate&#xff0c;显示执行出错 无法加载文件 D:\Project\RF_Project\venv\Scripts\acti…

1999-2022年各省研究与试验发展经费内部支出数据/研发经费内部支出数据/RD经费内部支出数据

1999-2022年各省研究与试验发展经费内部支出数据/研发经费内部支出数据/R&D经费内部支出数据 1、时间&#xff1a;1999-2022年 2、来源&#xff1a;整理自科技年鉴 3、指标&#xff1a;研究与试验发展经费内部支出/R&D经费内部支出/研发经费内部支出 4、范围&#…

Stable Diffusion 本地化部署

一、前言 最近在家背八股文背诵得快吐了&#xff0c;烦闷的时候&#xff0c;看到使用 AI 进行作图&#xff0c;可以使用本地话部署。刚好自己家里的电脑&#xff0c;之前买来玩暗黑4&#xff0c;配置相对来说来可以&#xff0c;就拿来试试。 此篇是按照 Github 上的 stable-d…

Leetcode 1143. 最长公共子序列

心路历程&#xff1a; 这道题还是按照之前公共子数组的角度去思考的话会超时&#xff0c;即考虑最后一个元素一定是公共子序列的最后一个元素。需要换一种建模思路&#xff0c;从而简化整个递推过程。 状态&#xff1a;以i, j为结尾的区间的最长公共子序列&#xff0c;text1[…

【HTML】简单制作一个动态3D正方体

目录 前言 开始 HTML部分 JS部分 CSS部分 效果图 总结 前言 无需多言&#xff0c;本文将详细介绍一段代码&#xff0c;具体内容如下&#xff1a; 开始 首先新建文件夹&#xff0c;创建两个文本文档&#xff0c;其中HTML的文件名改为[index.html]&#xff0c;JS的文件名改…

智慧展览馆:基于AI智能识别技术的视频智慧监管解决方案

一、建设背景 随着科技的不断进步和社会安全需求的日益增长&#xff0c;展览馆作为展示文化、艺术和科技成果的重要场所&#xff0c;其安全监控系统的智能化升级已成为当务之急。为此&#xff0c;旭帆科技&#xff08;TSINGSEE青犀&#xff09;基于视频智能分析技术推出了展览馆…

Windows下Docker安装Kafka3+集群

编写 docker-compose.yaml 主要参照&#xff1a;https://www.cnblogs.com/wangguishe/p/17563274.html version: "3"services:kafka1:image: bitnami/kafka:3.4.1container_name: kafka1environment:- KAFKA_HEAP_OPTS-Xmx1024m -Xms1024m- KAFKA_ENABLE_KRAFTyes- K…

在s390x架构机器上构建frps/frpc镜像 —— 筑梦之路

源码&#xff1a;GitHub - fatedier/frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet. # 克隆代码git clone https://github.com/fatedier/frp.git# 切换目录cd frp# 构建frps服务端docker build -t frps:s390x -f …

04 Python进阶:MySQL-PyMySQL

什么是 PyMySQL&#xff1f; PyMySQL 是一个用于 Python 的纯 Python MySQL 客户端库&#xff0c;提供了与 MySQL 数据库进行交互的功能。PyMySQL 允许 Python 开发人员连接到 MySQL 数据库服务器&#xff0c;并执行诸如查询、插入、更新和删除等数据库操作。 以下是 PyMySQL …