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\n", name, ticket)
ticket--
} else {
mutex.Unlock()
fmt.Printf("%s 票卖完了。。。\n", name)
break
}
mutex.Unlock()
}
}
结果
GOROOT=C:\Go #gosetup
GOPATH=E:\www\gopath #gosetup
C:\Go\bin\go.exe build -o C:\Users\brady\AppData\Local\Temp\___8go_build_main_go.exe E:/www/go/test/main.go #gosetup
C:\Users\brady\AppData\Local\Temp\___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
go 加锁的更多相关文章
- Mysql加锁过程详解
1.背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题.本文, ...
- [No000092]SVN学习笔记3-Import/Checkout(迁入/迁出),GetLock(加锁)
一.TortoiseSVN Client 获取服务器端的文件到新的本地文件夹 1.在本地新文件夹上右键菜单: 2.打开Repo-browser(可能需要输入你的用户名&密码) 3.输入服务器端 ...
- sqlserver事务加锁机制
锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 脏 ...
- Spring Boot 乐观锁加锁失败 - 使用AOP恢复错误
之前写了一些辅助工作相关的Spring Boot怎么使用AOP.这里继续正题,怎么减少Spring Boot 乐观锁加锁报错的情况(基本可以解决). 1. 包依赖 spring-boot-starte ...
- Spring Boot 乐观锁加锁失败 - 集成AOP
Spring Boot with AOP 手头上的项目使用了Spring Boot, 在高并发的情况下,经常出现乐观锁加锁失败的情况(OptimisticLockingFailureException ...
- MSSQL数据库表加锁
所指定的表级锁定提示有如下几种: 1. HOLDLOCK: 在该表上保持共享锁,直到整个事务结束,而不是在语句执行完立即释放所添加的锁. 2. NOLOCK:不添加共享锁和排它锁,当这个选项生效后,可 ...
- Oracle解锁与加锁(HR用户为例)
SQL*Plus: Release 9.2.0.4.0 - Production on Tue Jul 14 18:12:38 2009 Copyright (c) 1982, 2002, Ora ...
- java并发编程(十五)内存可见两种方式 加锁和volatile
1.volatile变量是一种稍弱的同步机制在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比synchronized关键字更轻量级的同步机制. ...
- iOS多线程之2.NSThread的加锁@synchronized
我在上一篇文章讲了线程的生命周期,这篇文章来讲讲线程加锁的注意事项与@synchronized关键字. 那什么时候需要加锁呢,就是当多条线程同时操作一个变量时,就需要加锁了.至于为什么要加锁,可以 ...
- mysql 加锁测试
今天研究cobar,做执行时间测试,需要对表记录加锁.用了以下两种方式为表记录加锁. 第一种方式: begin; //开始事务 select * from 表名 ( where ……) for ...
随机推荐
- Shader 001 - 函数造型能力
0x00 从函数出发 Shader 中的很多效果都是由函数计算得出的,如何更好地理解二者的关系呢.不妨先看看函数是什么?函数的定义可以简单地描述为:给定一个集合 A,对于其中的元素施加法则 f,则可以 ...
- ef6 code first,对已有数据库如何执行迁移
先执行:Enable-Migrations,会生成Migrations->Configuration.cs 再执行:Add-Migrations InitialCreate – IgnoreCh ...
- Docker镜像下载很慢,各种加速无效
mcr.microsoft.com/dotnet/...... 改成: dockerhub.azk8s.cn/dotnet/...... 或 mcr.azk8s.cn/dotnet/......
- mariadb 4
连接查询,视图,事物,索引,外键(第四章) 连接查询 --创建学生表 create table students ( id int unsigned not null auto_increment ...
- k8s架构分析(二)
master节点 k8s的集群由master和node组成,节点上运行着若干k8s服务. master节点之上运行着的后台服务有kube-apiserver .kube-scheduler.kube- ...
- Node.js 从零开发 web server博客项目[日志]
web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...
- 虚拟机堆(Heap)的基础知识
概述 一个进程对应一个JVM实例,一个运行时数据区,又包含多个线程,这些线程共享了方法区和堆,每个线程包含了程序计数器.本地方法栈和虚拟机栈 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核 ...
- Anaconda, conda, pyenv, virtualenv的区别
1.Python环境 Python解释器--Python.exe Python包集合--Lib,包括自带包和第三方包 2.Anaconda--一个科学计算环境,Python的发行版本 包括了Conda ...
- [视频]iNeuOS 自主可控工业互联网一体化解决方案 整体介绍
演示地址:http://demo.ineuos.net (注:自己注册) iNeuOS 自主可控工业互联网操作系统,提供全新解决方案 核心组件包括:边缘网关(iNeuLink).设备容器(iNeuK ...
- 使用TiDB把自己写分库分表方案推翻了
背景 在日益数据量增长的情况下,影响数据库的读写性能,我们一般会有分库分表的方案和使用newSql方案,newSql如TIDB.那么为什么需要使用TiDB呢?有什么情况下才用TiDB呢?解决传统分库分 ...