File tree Expand file tree Collapse file tree 2 files changed +4
-4
lines changed Expand file tree Collapse file tree 2 files changed +4
-4
lines changed Original file line number Diff line number Diff line change @@ -21,7 +21,7 @@ go程序初始化完毕后,调度器会进行一轮调度(位于runtime中的s
21
21
22
22
调度器找到G后的流程:
23
23
- 如果调度器在一轮调度之初发现当前M已经与某个G锁定,会立即停止调度并阻塞当前M,如果G到了可运行状态,M会被唤醒并继续运行G。
24
- - 如果当前M找到了可运行G,却发现该G与另外的M碎钉 ,它会唤醒绑定的M来运行该G,并重新为当前M寻找可运行G
24
+ - 如果当前M找到了可运行G,却发现该G与另外的M锁定 ,它会唤醒绑定的M来运行该G,并重新为当前M寻找可运行G
25
25
- 如果当前M未与任何G锁定(gcwaiting值不为0),那么停止Go调度器,即STW(Stop the world)并等待运行时串行任务正在执行
26
26
- 当锁定和运行时串行任务都为假,执行寻找G。
27
27
@@ -103,4 +103,4 @@ Go运行时系统会在分配新内存是会检查Go程序的内存使用增量
103
103
注意:
104
104
- GOGC环境变量也可以设置GC阈值,但是必须在程序启动前进行设置
105
105
- 关闭GC后就需要手动GC,` runtime.GC ` 函数可以手动触发一次GC,不过这个GC函数会阻塞调用方直到GC完成,此时GC以gcForceBlockMode模式执行
106
- - 调用` runtime/debug ` 包的` FreeOSMemory ` 函数也可以手动触发一次串行GC,并在GC完成后执行一次清扫堆操作
106
+ - 调用` runtime/debug ` 包的` FreeOSMemory ` 函数也可以手动触发一次串行GC,并在GC完成后执行一次清扫堆操作
Original file line number Diff line number Diff line change @@ -80,7 +80,7 @@ Go的`sync/atomic`包提供的存储函数都是以`Store`为前缀。
80
80
atomic.StoreInt32 (i *int3, v int32 )
81
81
```
82
82
83
- Go原子存储的特点:存储操作总会成功,因为u关心被操作值的旧值是什么 ,这与CAS有明显区别。
83
+ Go原子存储的特点:存储操作总会成功,因为不关心被操作值的旧值是什么 ,这与CAS有明显区别。
84
84
85
85
### 2.5 交换
86
86
@@ -108,4 +108,4 @@ Go还提供了`sync/atomic.Value`类型的结构体,用于存储需要原子
108
108
- 如果一个原子值没有通过Store方法存储值,那么其Load方法总是返回nil
109
109
- 原子值实例一旦存储了一个类型的值,后续再次Store存储时,存储的值必须也是原有的类型
110
110
111
- 尤其注意:atomic.Value变量(指针类型变量除外)声明后,值不应该被赋值到别处,比如赋值给别的变量,作为参数值传入函数,作为结果值从函数返回等等,这样会有安全隐患。 因为结构体值的复制不但会生产该值的副本,还会生成其中字段的副本,会造成并发安全保护失效。
111
+ 尤其注意:atomic.Value变量(指针类型变量除外)声明后,值不应该被赋值到别处,比如赋值给别的变量,作为参数值传入函数,作为结果值从函数返回等等,这样会有安全隐患。 因为结构体值的复制不但会生产该值的副本,还会生成其中字段的副本,会造成并发安全保护失效。
You can’t perform that action at this time.
0 commit comments