go 加锁

package main

import (
"fmt"
"math/rand"
"sync"
"time"
)

var ticket int = 10

var (
mutex sync.Mutex
wg sync.WaitGroup
)

func main() {

wg.Add(4)
go sell("售票口1")
go sell("售票口2")
go sell("售票口3")
go sell("售票口4")
wg.Wait()
}

func sell(name string) {
defer wg.Done()
for {
mutex.Lock()
if ticket > 0 {
rand.Seed(time.Now().Unix())
time.Sleep(time.Duration(rand.Intn(1000)) * time.Microsecond)
fmt.Printf("%s 卖出票 %d ", name, ticket)
ticket--
} else {
mutex.Unlock()
fmt.Printf("%s 票卖完了。。。 ", name)
break
}
mutex.Unlock()
}
}

  

结果

GOROOT=C:Go #gosetup
GOPATH=E:wwwgopath #gosetup
C:Goingo.exe build -o C:UsersradyAppDataLocalTemp\___8go_build_main_go.exe E:/www/go/test/main.go #gosetup
C:UsersradyAppDataLocalTemp\___8go_build_main_go.exe #gosetup
售票口1 卖出票 10
售票口1 卖出票 9
售票口1 卖出票 8
售票口4 卖出票 7
售票口2 卖出票 6
售票口3 卖出票 5
售票口1 卖出票 4
售票口4 卖出票 3
售票口2 卖出票 2
售票口3 卖出票 1
售票口2 票卖完了。。。
售票口3 票卖完了。。。
售票口1 票卖完了。。。
售票口4 票卖完了。。。

Process finished with exit code 0

原文地址:https://www.cnblogs.com/php-linux/p/13150822.html