【Golang】并发编程之三大问题:原子性、有序性、可见性
原子性:一个操作是原子的(atomic)如果它要么执行,要么不执行,不会在执行过程中被其他因素打断。在Golang中,可以通过sync/atomic
包提供的原子级操作来保证原子性。
import "sync/atomic"
var counter int32
func increment() {
atomic.AddInt32(&counter, 1)
}
有序性:有序性指的是程序执行的顺序按照代码的先后顺序执行。在Golang中,可以通过sync/atomic
包提供的原子级操作来保证操作的有序性。
import "sync/atomic"
var counter int32
func increment() {
atomic.AddInt32(&counter, 1)
}
在Golang中,通常通过volatile关键字来保证有序性,但是Golang没有提供直接的volatile关键字,通常是通过其他方式来保证,例如通过sync/atomic
包提供的原子操作。
可见性:可见性是指当一个线程修改了共享变量的值,其他线程能立即看到修改后的值。在Golang中,可以通过sync
和sync/atomic
包提供的锁和内存屏障(memory barrier)来保证可见性。
import (
"sync"
"sync/atomic"
)
var counter int32
var wg sync.WaitGroup
func increment() {
atomic.AddInt32(&counter, 1)
wg.Done()
}
func main() {
for i := 0; i < 10; i++ {
wg.Add(1)
go increment()
}
wg.Wait()
// 当wg.Wait()返回时,所有的increment调用都已经完成
fmt.Println("Counter:", counter)
}
在Golang中,通过sync
和sync/atomic
包提供的锁和内存屏障(memory barrier),可以保证共享变量的可见性。通过sync.Mutex
或sync.RWMutex
来保证互斥访问时的可见性,通过sync/atomic
包来保证原子操作的可见性。
评论已关闭