Go基础——并发作业

Mutex

package main
import (
    "fmt"
    "sync"
)
var mu sync.Mutex
var chain string
func main() {
    chain = "main"
    A()
    fmt.Println(chain)
}
func A() {
    mu.Lock()
    defer mu.Unlock()
    chain = chain + " --> A"
    B()
}
func B() {
    chain = chain + " --> B"
    C()
}
func C() {
    mu.Lock()
    defer mu.Unlock()
    chain = chain + " --> C"
}

A: 不能编译

B: 输出main --> A --> B --> C

C: 输出main

D: panic

RWMutex

package main
import (
   "fmt"
   "sync"
   "time"
)
var mu sync.RWMutex
var count int
func main() {
   go A()
   time.Sleep(2 * time.Second)
   mu.Lock()
   defer mu.Unlock()
   count++
   fmt.Println(count)
}
func A() {
   mu.RLock()
   defer mu.RUnlock()
   B()
}
func B() {
   time.Sleep(5 * time.Second)
   C()
}
func C() {
   mu.RLock()
   defer mu.RUnlock()
}

A: 不能编译

B: 输出1

C: 程序hang住

D: panic

Waitgroup

package main
import (
    "sync"
    "time"
)
func main() {
    var wg sync.WaitGroup
    wg.Add(1)
    go func() {
        time.Sleep(time.Millisecond)
        wg.Done()
        wg.Add(1)
    }()
    wg.Wait()
}

A: 不能编译

B: 无输出,正常退出

C: 程序hang住

D: panic

Mutex

package main
import (
   "fmt"
   "sync"
)
type MyMutex struct {
   count int
   sync.Mutex
}
func main() {
   var mu MyMutex
   mu.Lock()
   var mu2 = mu
   mu.count++
   mu.Unlock()
   mu2.Lock()
   mu2.count++
   mu2.Unlock()
   fmt.Println(mu.count, mu2.count)
}

A: 不能编译

B: 输出1, 1

C: 输出1, 2

D: panic

Map

package main
import (
    "fmt"
    "sync"
)
func main() {
    var m sync.Map
    m.LoadOrStore("a", 1)
    m.Delete("a")
    fmt.Println(m.Len())
}

A: 不能编译

B: 输出1

C: 输出0

D: panic

dddda

posted @   lovevivi121  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示