栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

golang模拟抢票

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

golang模拟抢票

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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/988478.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号