原子操作
package main
import (
"fmt"
"sync"
"sync/atomic" //原子操作,比读写锁和互斥锁都要快,原子操作在用户态,其他锁在内核态
"time"
)
var w sync.WaitGroup
var count int32
func main() {
w.Add(1)
start := time.Now().UnixNano()
go func() {
for i := 0; i < 1000000; i++ {
atomic.AddInt32(&count, 1) //原子操作
}
w.Done()
}()
for i := 0; i < 1000000; i++ {
atomic.AddInt32(&count, 1)
}
w.Wait()
end := time.Now().UnixNano()
fmt.Println((end - start) / 1000 / 1000)
fmt.Println(count)
}
互斥锁
package main
import (
"fmt"
"sync"
"time"
)
var lock sync.Mutex //互斥锁
var w sync.WaitGroup //等待子线程退出
var count int
func main() {
start := time.Now().UnixNano()
w.Add(1) //相当于标记起一个子线程
go func() {
for i := 0; i < 1000000; i++ {
lock.Lock()
count++
lock.Unlock()
}
w.Done() //相当于标记关闭一个子线程
}()
for i := 0; i < 1000000; i++ {
lock.Lock()
count++
lock.Unlock()
}
w.Wait()
end := time.Now().UnixNano()
fmt.Println((end - start) / 1000 / 1000)
fmt.Println(count)
}
读写锁
package main
import (
"fmt"
"sync"
"time"
)
var rwLock sync.RWMutex //读写锁,读锁所有线程都可以同时用(除了写线程),但是同时写线程不能用写锁。用于读多写少。
var lock sync.Mutex
var w sync.WaitGroup
var count int
func main() {
w.Add(1)
start := time.Now().UnixNano()
go func() {
for i := 0; i < 1000; i++ {
//rwLock.Lock() //写锁
lock.Lock() //互斥锁
count++
time.Sleep(5 * time.Millisecond)
lock.Unlock()
//rwLock.Unlock()
}
w.Done()
}()
for i := 0; i < 16; i++ {
w.Add(1)
go func() {
for i := 0; i < 5000; i++ {
//rwLock.RLock() //读锁
lock.Lock()
time.Sleep(1 * time.Millisecond)
lock.Unlock()
//rwLock.RUnlock()
}
w.Done()
}()
}
w.Wait()
end := time.Now().UnixNano()
fmt.Println((end - start) / 1000 / 1000)
//fmt.Println(count)
}