32 lines
683 B
Go
32 lines
683 B
Go
package main
|
|
|
|
import (
|
|
"log"
|
|
"math/rand"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
var (
|
|
instance string
|
|
once sync.Once // initialize instance with once.Do
|
|
)
|
|
|
|
func claim(color string, w *sync.WaitGroup) {
|
|
time.Sleep(time.Duration(rand.Intn(1e8))) // hesitate up to .1 sec
|
|
log.Println("trying to claim", color)
|
|
once.Do(func() { instance = color })
|
|
log.Printf("tried %s. instance: %s", color, instance)
|
|
w.Done()
|
|
}
|
|
|
|
func main() {
|
|
rand.Seed(time.Now().Unix())
|
|
var w sync.WaitGroup
|
|
w.Add(2)
|
|
go claim("red", &w) // these two attempts run concurrently
|
|
go claim("blue", &w)
|
|
w.Wait()
|
|
log.Println("after trying both, instance =", instance)
|
|
}
|