golang线程安全

博客 分享
0 211
张三
张三 2022-03-03 14:56:04
悬赏:0 积分 收藏

golang线程安全

目录
  • 1.golang的map是线程安全的吗?怎么安全使用map
  • 2.线程独享什么,共享什么
  • 3.进程状态转换
  • 4.Log包线程安全吗?
  • 5.写的循环队列是不是线程安全?
  • 6.go协程线程安全吗
  • 7.go为什么高并发好?go的调度模型
  • 8.Golang 中常用的并发模型
  • 9.进程与线程

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.进程状态转换

img

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:每个进程都自带一个线程,线程才是真正的执行单位,进程只是再线程中提供资源
选择了IT,必定终身学习
posted @ 2022-03-03 14:38 Jeff的技术栈 阅读(0) 评论(0) 编辑 收藏 举报
回帖
    张三

    张三 (王者 段位)

    821 积分 (2)粉丝 (41)源码

     

    温馨提示

    亦奇源码

    最新会员