golang模拟抢票

阻塞信道

package main

import (
	"fmt"
	"time"
)

func main() {
	count := 1000
	incs := make(chan int, 1)
	go func() {
		for i := count; i > 0; i-- {
			incs <- i
		}
	}()
	go func(chan int) {
		for {
			i := <-incs
			fmt.Println("A get ticket", i)
			time.Sleep(100)
		}
	}(incs)
	go func(chan int) {
		for {
			i := <-incs
			fmt.Println("B get ticket", i)
			time.Sleep(100)
		}
	}(incs)
	time.Sleep(2 * time.Second)
}

设置信道的容量为1,使其成为阻塞信道,起到阻塞协程的作用。
信道已满时,阻塞流入协程;信道为空时,阻塞流出协程。
time.Sleep(100)的作用是防止CPU被某一流出协程一直抢占。
time.Sleep(2 * time.Second)的作用是保证非主协程执行完毕。

互斥锁

package main

import (
	"fmt"
	"time"
	"sync"
)

func main() {
	count := 1000
	var l sync.Mutex
	go func(*int) {
		for count > 0 {
			l.Lock()
			fmt.Println("A get ticket", count)
			count--
			l.Unlock()
			time.Sleep(100)
		}
	}(&count)
	go func(*int) {
		for count > 0 {
			l.Lock()
			fmt.Println("B get ticket", count)
			count--
			l.Unlock()
			time.Sleep(100)
		}
	}(&count)
	time.Sleep(2 * time.Second)
}

备注:一定要在linux环境下运行

go run main.go