golang线程安全
1.golang的map是线程安全的吗?怎么安全使用map
不安全,需要进行资源保护。
sync互斥锁,或者redis分布式锁
或者:这个字典类型提供了一些常用的键值存取操作方法,并保证了这些操作的并发安全
var ma sync.Map //该类型是开箱即用,只需要声明既可
ma.Store("key", "value") // 存储值
ma.Delete("key") //删除值
ma.LoadOrStore("key", "value")// 获取值,如果没有则存储
fmt.Println(ma.Load("key"))//获取值
//遍历
ma.Range(func(key, value interface{}) bool {
fmt.Printf("key:%s ,value:%s \n", key, value)
//如果返回:false,则退出循环,
return true
})
2.线程独享什么,共享什么
堆:根据代码动态分配内存,频繁的new,delete造成空间不连续,从而产生大量碎片,使程序效率降低
栈:存放局部变量,由编译器自动管理,无需我们手工控制
共享:
1.进程代码段
2.进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)
3.进程打开的文件描述符
4.信号的处理器
5.进程的当前目录
6.进程用户ID与进程组ID
独享:
当一个方法执行时,所有的变量和参数都会保存在堆栈中内存空间,这个空间是线程独享的,所以线程之间不会相互冲突。
1.线程ID
2.寄存器组的值
3.线程的堆栈
4.错误返回码
5.线程的信号屏蔽码
3.进程状态转换

4.Log包线程安全吗?
安全,因为:
在输出的位置做了线程安全的保护,加了锁
l.mu.Lock()
defer l.mu.Unlock()
5.写的循环队列是不是线程安全?
channel上面实现的是线程安全
如果是切片实现,需要加锁实现线程安全。但是效率变低了
不是,怎么保证线程安全,加锁,效率有点低啊,Go推崇原子操作和channel
6.go协程线程安全吗
不安全,需要进行资源保护。
sync互斥锁,或者redis分布式锁
7.go为什么高并发好?go的调度模型
因为协程,go天生支持并发
GMP:
goroutine说到底其实就是协程,但是它比线程更小,几十个goroutine可能体现在底层就是五六个线程,Go语言内部帮你实现了这些goroutine之间的内存共享
8.Golang 中常用的并发模型
通过channel通知实现并发控制
通过sync包中的WaitGroup实现并发控制
在Go 1.7 以后引进的强大的Context上下文,实现并发控制
9.进程与线程
进程:资源单位(数据隔离)
线程:执行单位(数据共享)
ps:每个进程都自带一个线程,线程才是真正的执行单位,进程只是再线程中提供资源
golang线程安全的更多相关文章
- golang 线程与通道
首先我们来看线程,在golang里面也叫goroutine 在读这篇文章之前,我们需要了解一下并发与并行.golang的线程是一种并发机制,而不是并行.它们之间的区别大家可以上网搜一下,网上有很多的介 ...
- 你不得不知的Golang线程模型 [转载]
原著:翟陆续(加多) 资深Java , 著Java并发编程之美 一.前言 本节我们来探讨Go的线程模型,首先我们先来回顾下常见的三种线程模型,然后在介绍Go中独特的线程模型. 二.三种线程模型 线程的 ...
- Golang 线程池
经常会用到协程,但是不能一下开那么多协调,只需要 poolSize 个即可,多了不行.这些个协程在执行完后必须等其完成之后才能进行下一步动作.假定工作方法为 work . package main i ...
- Golang 之协程详解
转自:https://www.cnblogs.com/liang1101/p/7285955.html 一.Golang 线程和协程的区别 备注:需要区分进程.线程(内核级线程).协程(用户级线程)三 ...
- go协程理解
一.Golang 线程和协程的区别 备注:需要区分进程.线程(内核级线程).协程(用户级线程)三个概念. 进程.线程 和 协程 之间概念的区别 对于 进程.线程,都是有内核进行调度,有 CPU 时间片 ...
- 【GoLang】GoLang map 非线程安全 & 并发度写优化
Catena (时序存储引擎)中有一个函数的实现备受争议,它从 map 中根据指定的 name 获取一个 metricSource.每一次插入操作都会至少调用一次这个函数,现实场景中该函数调用更是频繁 ...
- golang中最大协程数的限制(线程)
golang中最大协程数的限制 golang中有最大协程数的限制吗?如果有的话,是通过什么参数控制呢?还是通过每个协程占用的资源计算? 通过channel控制协程数的就忽略吧. 以我的理解,计算机资源 ...
- Golang源码学习:监控线程
监控线程是在runtime.main执行的时候在系统栈中创建的,监控线程与普通的工作线程区别在于,监控线程不需要绑定p来运行. 监控线程的创建与启动 简单的调用图 先给出个简单的调用图,好心里有数,逐 ...
- 写了一年golang,来聊聊进程、线程与协程
本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star. 进程 在早期的单任务计算机中,用户一次只能提交一个作业,独享系统的全部资源,同时也只能干一件事 ...
随机推荐
- manjaro20夜灯夜间模式开关
- 实习之bii--在vsphere client 给esxi上的虚拟机增加U盘识别
esxi上安装虚拟机默认不包含U盘控制器,在服务器上插U盘也不会识别,所以要通过客户端登陆esxi管理为虚拟机增加U盘控制器,步骤如下: 1.首先登陆服务器的管理ip 2.选择一部虚拟机,进行编辑设置 ...
- C++11多线程之future(一)
// ConsoleApplication5.cpp : 定义控制台应用程序的入口点. #include "stdafx.h" #include<random> #in ...
- Android开发----RecyclerView视图的学习
RecyclerView RecyclerView是什么? RecyclerView是如今Android开发中最常用的控件,其相较于ListView和GridView的功能更为强大,优化了两者的各种不 ...
- PyCharm破解无限试用
一:安装插件 1.打开PyCharm,进入后,点击左上角File,在点击Settings(设置). 2.进入后,点击Plugins,在点击(2.设置图标),然后点击Manage Plugin Repo ...
- Springboot +redis+⾕歌开源Kaptcha实现图片验证码功能
Springboot +redis+⾕歌开源Kaptcha实现图片验证码功能 背景 注册-登录-修改密码⼀般需要发送验证码,但是容易被 攻击恶意调⽤ 什么是短信-邮箱轰炸机 手机短信轰炸机是批.循环给 ...
- Redis 源码简洁剖析 04 - Sorted Set 有序集合
Sorted Set 是什么 Sorted Set 命令及实现方法 Sorted Set 数据结构 跳表(skiplist) 跳表节点的结构定义 跳表的定义 跳表节点查询 层数设置 跳表插入节点 zs ...
- C++读写图片文件
1.C方式 string sourcefilename = "D:\\Logo.jpg"; string destfilename="D:\\Logo1.jpg" ...
- Linux shell脚本之 if条件判断 (转)
IF条件判断 1.基本语法: if [ command ]; then 符合该条件执行的语句 fi 2.扩展语法: if [ command ];then 符合该条件执行的语句 elif [ comm ...
- War包是什么??
感谢大佬: https://blog.csdn.net/Stitch__/article/details/88091745 https://www.jianshu.com/p/3b5c45e8e5bd ...