/images/hugo/avatar.png

go Pool

1. Pool 概述

Go 是一个自动垃圾回收的编程语言,采用三色并发标记算法标记对象并回收。但是,如果你想使用 Go 开发一个高性能的应用程序的话,就必须考虑垃圾回收给性能带来的影响。对象池化, 可以有效地减少新对象的创建次数,是性能优化的重要方式。

线程安全的 map

线程安全的 map

1. 线程安全的 map 概述

1.1 map 的基本使用

键类型

Go 内建的 map 类型如下:

1
map[K]V

其中,key 类型的 K 必须是可比较的(comparable),在 Go 语言中,bool、整数、浮点数、复数、字符串、指针、Channel、接口都是可比较的,包含可比较元素的 struct 和数组,这俩也是可比较的,而 slice、map、函数值都是不可比较的。通常情况下,我们会选择内建的基本类型,比如整数、字符串做 key 的类型,因为这样最方便。

Once 实现单例

Once 有且仅有一次执行

1. Once 概述

Once 可以用来执行且仅仅执行一次动作:Once 常常用来初始化单例资源,或者并发访问只需初始化一次的共享资源,或者在测试的时候初始化一次测试资源。

Cond 条件变量

Cond 条件变量

1. Cond 概述

Go 标准库提供 Cond 原语的目的是,为等待 / 通知场景下的并发问题提供支持。Cond 通常应用于等待某个条件的一组 goroutine,等条件变为 true 的时候,其中一个 goroutine 或者所有的 goroutine 都会被唤醒执行。顾名思义,Cond 是和某个条件相关:

WaitGroup

WaitGroup 任务编排

1. WaitGroup 使用

WaitGroup 很简单,就是 package sync 用来做任务编排的一个并发原语。它要解决的就是并发 - 等待的问题: goroutine A 等待一组 goroutine 全部完成。

很多操作系统和编程语言都提供了类似的并发原语。比如,Linux 中的 barrier、Pthread(POSIX 线程)中的 barrier、C++ 中的 std::barrier、Java 中的 CyclicBarrier 和 CountDownLatch 等。

RWMutex

读写锁 RWMutex

1. RWMutex 使用

标准库中的 RWMutex 是一个 reader/writer 互斥锁,用来解决并发读写问题,特别适用于读多写少的场景。RWMutex 在某一时刻只能由任意数量的 reader 持有,或者是只被单个的 writer 持有。