原子操作
原子操作即是进行过程中不能被中断的操作,针对某个值的原子操作在被进行的过程中,CPU 绝不会再去进行其他的针对该值的操作。为了实现这样的严谨性,原子操作仅会由一个独立的 CPU 指令代表和完成。原子操作是无锁的,常常直接通过 CPU 指令直接实现。 事实上,其它同步技术的实现常常依赖于原子操作。
Go 对原子操作的支持
Go 语言的 sync/atomic 包提供了对原子操作的支持,用于同步访问整数和指针。
- Go 语言提供的原子操作都是非入侵式的。
- 这些函数提供的原子操作共有五种:增减、比较并交换、载入、存储、交换。
- 支持的类型类型: int32、int64、uint32、uint64、uintptr、unsafe.Pointer
原子操作与互斥锁的区别
- 互斥锁是一种数据结构,用来让一个线程执行程序的关键部分,完成互斥的多个操作。
- 原子操作是针对某个值的单个互斥操作。
- 可以把互斥锁理解为悲观锁,共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程。
- atomic 包提供了底层的原子性内存原语,这对于同步算法的实现很有用。