概念Goroutine可以理解为一种Go语言的协程(轻量级线程),是Go支持高并发的基础,属于用户态的线程,由Go runtime管理而不是操作系统。底层...
原子操作由底层硬件支持,而锁是基于原子操作+信号量完成的。若实现相同的功能,前者通常会更有效率原子操作是单个指令的互斥操作;互斥锁/读写锁是一种数据结构,...
概念:可重入锁又称为递归锁,是指在同一个线程在外层方法获取锁的时候,在进入该线程的内层方法时会自动获取锁,不会因为之前已经获取过还没释放再次加锁导致死锁为...
概念:读写互斥锁RWMutex,是对Mutex的一个扩展,当一个 goroutine 获得了读锁后,其他 goroutine可以获取读锁,但不能获取写锁;...
线程没有获取到锁时常见有2种处理方式:- 一种是没有获取到锁的线程就一直循环等待判断该资源是否已经释放锁,这种锁也叫做自旋锁,它不用将线程阻塞起来, ...
在Go一共可以分为两种抢锁的模式,一种是正常模式,另外一种是饥饿模式。正常模式(非公平锁)在刚开始的时候,是处于正常模式(Barging),也就是,当一个...
Go sync包提供了两种锁类型:互斥锁sync.Mutex 和 读写互斥锁sync.RWMutex,都属于悲观锁。概念:Mutex是互斥锁,当一个 go...
无缓冲:一个送信人去你家送信,你不在家他不走,你一定要接下信,他才会走。 有缓冲:一个送信人去你家送信,扔到你家的信箱转身就走,除非你的信箱满了,他必须等...
死锁:单个协程永久阻塞两个或两个以上的协程的执行过程中,由于竞争资源或由于彼此通信而造成的一种阻塞的现象。channel死锁场景:非缓存channel只写...
“不要通过共享内存来通信,我们应该使用通信来共享内存” 这句话想必大家已经非常熟悉了,在官方的博客,初学时的教程,甚至是在 Go 的源码中都能看到无论是通...
多个goroutine并发执行时,每一个goroutine抢到处理器的时间点不一致,gorouine的执行本身不能保证顺序。即代码中先写的gorouine...
为什么设计成线程安全?不同协程通过channel进行通信,本身的使用场景就是多线程,为了保证数据的一致性,必须实现线程安全如何实现线程安全的?channe...
channel有2种类型:无缓冲、有缓冲channel有3种模式:写操作模式(单向通道)、读操作模式(单向通道)、读写操作模式(双向通道) 写操作...
概念:Go中的channel 是一个队列,遵循先进先出的原则,负责协程之间的通信(Go 语言提倡不要通过共享内存来通信,而要通过通信来实现内存共享,CSP...
Go 语言的 sync.Map 支持并发读写,采取了 “空间换时间” 的机制,冗余了两个数据结构,分别是:read 和 dirtytype Map str...
什么是负载因子?负载因子(load factor),用于衡量当前哈希表中空间占用率的核心指标,也就是每个 bucket 桶存储的平均元素个数。负载因子 =...
比较常用的Hash冲突解决方案有链地址法和开放寻址法:链地址法当哈希冲突发生时,创建新单元,并将新单元添加到冲突单元所在链表的尾部。开放寻址法当哈希冲突发...
map默认是并发不安全的,同时对map进行并发读写时,程序会panic,原因如下:Go 官方在经过了长时间的讨论后,认为 Go map 更应适配典型使用场...
使用 range 多次遍历 map 时输出的 key 和 value 的顺序可能不同。这是 Go 语言的设计者们有意为之,旨在提示开发者们,Go 底层实现...
Go中的map是一个指针,占用8个字节,指向hmap结构体源码包中src/runtime/map.go定义了hmap的数据结构:hmap包含若干个结构为b...
先看下线程安全的定义:多个线程访问同一个对象时,调用这个对象的行为都可以获得正确的结果,那么这个对象就是线程安全的。若有多个线程同时执行写操作,一般都需要...
扩容会发生在slice append的时候,当slice的cap不足以容纳新元素,就会进行扩容,扩容规则如下如果新申请容量比两倍原有容量大,那么扩容后容量...
深拷贝:拷贝的是数据本身,创造一个新对象,新创建的对象与原对象不共享内存,新创建的对象在内存中开辟一个新的内存地址,新对象值修改时不会影响原对象值实现深拷...
1)数组长度不同数组初始化必须指定长度,并且长度就是固定的切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大2)函数传参不同数组是值类型,将...
切片是基于数组实现的,它的底层是数组,可以理解为对 底层数组的抽象。源码包中src/runtime/slice.go 定义了slice的数据结构:type...
首先纠正下make和new是内置函数,不是关键字变量初始化,一般包括2步,变量声明 + 变量内存分配,var关键字就是用来声明变量的,new和make函数...
定义:defer 能够让我们推迟执行某些函数调用,推迟到当前函数返回前才实际执行。defer与panic和recover结合,形成了Go语言风格的异常与捕...
先说下结论:Go语言中所有的传参都是值传递(传值),都是一个副本,一个拷贝。参数如果是非引用类型(int、string、struct等这些),这样就在函数...
一般来说,局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。但这在 Go 中是安全的,Go 编译器将会对每个局部...
如果方法的接收者是指针类型,无论调用者是对象还是对象指针,修改的都是对象本身,会影响调用者;如果方法的接收者是值类型,无论调用者是对象还是对象指针,修改的...
Go1.14 版本以 STW 为界限,可以将 GC 划分为五个阶段:GCMark 标记准备阶段,为并发标记做准备工作,启动写屏障 STWGCMark 扫描...
当本线程 M 因为 G 进行的系统调用阻塞时,线程释放绑定的 P,把 P 转移给其 他空闲的 M 执行。 细节:当发生上线文切换时,需要对执行现场进行保护...
已加贵站~
name: 技研录
link: https://linmohan.fun/
avatar: https://linmohan.fun/img/favicon.png
descr: 「代码重构世界,逻辑解构真理」