sync包
Mutex互斥锁
Lock()、Unlock()
查看代码
go
func main() {
lock := &sync.Mutex{}
go LockFunc(lock)
go LockFunc(lock)
for{}
}
func LockFunc(lock *sync.Mutex){
lock.Lock()
fmt.Println("11")
time.Sleep((1*time.Second))
lock.Unlock()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
:::
RWMutex读写互斥锁
Lock()、Unlock()、Rlock()、RUnlock()
- Lock写的时候排斥其他的写锁和读锁
- RLock在读取的时候不会阻塞其他的读锁但是会排斥掉写锁
查看代码
go
func main() {
lock := &sync.Mutex{}
read_lock := &sync.RWMutex{}
go LockFunc(lock)
go LockFunc(lock)
go ReadLockFunc(read_lock)
go ReadLockFunc(read_lock)
go ReadLockFunc(read_lock)
go ReadLockFunc(read_lock)
for{}
}
func LockFunc(lock *sync.Mutex){
// 写的时候排斥其他的写锁和读锁
lock.Lock()
fmt.Println("11")
time.Sleep((1*time.Second))
lock.Unlock()
}
func ReadLockFunc(r_lock *sync.RWMutex){
// 在读取的时候不会阻塞其他的读锁但是会排斥掉写锁
r_lock.RLock()
fmt.Println("read-11")
time.Sleep((1*time.Second))
r_lock.RUnlock()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Once
Once.Do(一个函数)这个方法无论被调用多少次这里只会执行一次
查看代码
go
func Once(){
once := &sync.Once{}
for i:=1; i<5; i++ {
once.Do(func() {
fmt.Println(i)
})
}
for i:=0; i<5; i++ {
once.Do(func() {
fmt.Println(i)
})
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
WaitGroup
Add(delta int)设定需要Done多少次 Done() Done 1次+1 Wait() 再到达Done的次数前一直阻塞
查看代码
go
func WaitG (){
w := &sync.WaitGroup{}
w.Add(2)
go func(){
time.Sleep(8*time.Second)
w.Done()
fmt.Println("delta-1")
}()
go func(){
time.Sleep(6*time.Second)
w.Done()
fmt.Println("delta-1")
}()
w.Wait()
time.Sleep(4*time.Second)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Map一个并发字典
Store、Load、LoadOrStore、Range、Delete
查看代码
go
func SyMap(){
m := &sync.Map{}
go func(){
for{
m.Store(4, 0)
}
}()
go func(){
for{
fmt.Println(m.Load(4))
}
}()
time.Sleep(100)
m.Store(1,2)
m.LoadOrStore(3,3)
m.Delete(1)
fmt.Println(m.LoadOrStore(3,3))
m.Range(func(k, v interface{}) bool {
fmt.Println(k,"==>",v)
time.Sleep(100)
return true
})
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Pool并发池
Put、Get
查看代码
go
func Pool(){
p := &sync.Pool{}
p.Put(1)
p.Put(2)
p.Put(3)
p.Put(4)
p.Put(5)
p.Put(6)
for i:=0; i<8; i++{
time.Sleep(1 *time.Second)
fmt.Println(p.Get())
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
Cond没多大用的通知解锁
NewCond(lock)创建一个cond co.L.Lock()、co.L.Unlock(),创建一个锁区间在区域内部可co.wait() co.roadcast()解锁全部 co.Signal()解锁一个
查看代码
go
func Cond(){
co := sync.NewCond(&sync.Mutex{})
// co.L.Lock()
// co.Wait()
// co.Wait()
// co.Wait()
// co.L.Unlock()
// co.Signal()
// co.Broadcast()
go func(){
co.L.Lock()
fmt.Println("Lock1")
co.Wait()
fmt.Println("unlock1")
co.L.Unlock()
}()
go func(){
co.L.Lock()
fmt.Println("Lock2")
co.Wait()
fmt.Println("unlock2")
co.L.Unlock()
}()
time.Sleep(2*time.Second)
// co.Broadcast()
co.Signal()
time.Sleep(1*time.Second)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29