泊爷带你学go -- 加锁的问题
package main import (
"fmt"
"sync"
) var l sync.Mutex
var a string func f() {
a = "hello, world"
l.Unlock()
} //还是需要加锁的!!!
type testClass struct {
mutex sync.Mutex
x []byte
} func (this *testClass) init() {
this.x = make([]byte, 0)
} func (this *testClass) addx(val byte) {
this.mutex.Lock()
defer this.mutex.Unlock()
this.x = append(this.x, val)
} func (this *testClass) print() {
fmt.Println(this.x)
} var x1 chan int var x2 chan int func f1(txtcls *testClass) {
txtcls.addx('x')
x1 <- 1
} func f2(txtcls *testClass) {
txtcls.addx('y')
x2 <- 1
} func main() {
x1 = make(chan int)
x2 = make(chan int)
var txtcls testClass
txtcls.init() go f1(&txtcls) go f2(&txtcls) select {
case <-x1:
fmt.Println("xxxxx")
} select {
case <-x2:
fmt.Println("yyyyy")
} txtcls.print() /*
l.Lock()
go f()
l.Lock()
print(a)
l.Unlock()
*/
}
以上代码说明如下问题,2个协程同时对一个对象指针变量进行读操作的时候需要进行加锁
那么不加有什么问题呢:
会出现打印出只有一个变量的情况
泊爷带你学go -- 加锁的问题的更多相关文章
- 泊爷带你学go -- 经典的继承与接口 简直吊炸天 !
package main import ( "fmt" ) type TeamBase struct { m_TeamId uint64 m_Rid uint32 m_RoomRu ...
- 泊爷带你学go -- 反射的经典玩法
package main import ( "fmt" "reflect" ) type order struct { ordId int customerId ...
- 泊爷带你学go -- redis连接池的操作
package main import ( "common" "fmt" "proto" "strconv" " ...
- 我要带徒弟学写JAVA架构,引路架构师之路(Jeecg开源社区)
带徒弟学JAVA架构(Jeecg社区) Java程序员如何打破工作2,3年的瓶颈问题,如何更上一层楼? 太多的巧合,让我接触到了开源,通过JEECG与很多朋友交流后,让我有了帮助别 ...
- 【凯子哥带你学Framework】Activity界面显示全解析(下)
咱们接着上篇继续讲,上篇没看的请戳:[凯子哥带你学Framework]Activity界面显示全解析(上) 如何验证上一个问题 首先,说明一下运行条件: //主题 name="AppThem ...
- 带你学C带你飞!
C语言免费课程推荐:带你学C带你飞! 想学习C语言,首先就要了解什么是C语言: C语言是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码 ...
- 老段带你学鸟哥Linux视频教程 包含基础班+提高班
老段带你学鸟哥Linux视频教程 包含基础班+提高班,附带pdf文档. 目录结构如下: 目录:/-老段带你学鸟哥Linux视频教程 [.9G] ┣━━老段带你学鸟哥-服务器篇 [1009.4M] ┃ ...
- 手摸手带你学移动端WEB开发
HTML常用标签总结 手摸手带你学CSS HTML5与CSS3知识点总结 手摸手带你学移动端WEB开发 好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/Ro ...
- 手摸手带你学CSS
好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star HTML常用标签总结 前言 在大一的时候,上过网页设计的课 ...
随机推荐
- 第 9 章 数据管理 - 075 - 配置 VirtualBox backend
配置 VirtualBox backend 在 VirtualBox 宿主机上启动 vboxwebsrv 服务: C:\Program Files\Oracle\VirtualBox > VBo ...
- php输出语句有什么不同
print()函数: 输出一个或者多个字符串.同echo一样,实际上它并不是一个函数.print有返回值.而echo没有.当其执行失败时返回false,成功 则返回true,速度比echo稍慢.只能打 ...
- spring history
Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Spring的用途不仅仅限于服务器端的开发.从简单性.可测试性和松耦 ...
- 华为的云计算基于openstack #stackalytics#
华为的云计算基于openstack,具体实力可以参考openstack 社区提供的stackalytics http://stackalytics.com/
- php无限极分类的实现
//指定根层级的树状图 function generateTree($list, $root = 0, $pk = 'id', $pid = 'pid', $child = '_child') { $ ...
- C# T 泛型类,泛型方法的约束条件用法
class A<T> where T:new() 这是类型参数约束,where表名了对类型变量T的约束关系.where T:A 表示类型变量是继承于A的,或者是A本省.where T: n ...
- .net mvc 上传头像
我用的是mvc5 开发环境vs2017 [仅供参考] [视图代码] <div > <img src="@path" alt="@att.Count&q ...
- composer 自动加载(php-amqplib)
最近要使用RabbitMQ 做消息队列,也是刚接触到.因为用的的TP框架,comoser又下载不下来,所以只能手动下载拓展包,做手动加载,在php-amqplib是我手动下载下来的拓展包,创建一个co ...
- Response重定向实现参数隐藏
最近在弄一个SSH项目,前期已经做好了,现在的需求是进行单点登陆实现,涉及到重定向跳转(带有参数那种)情况,但是不能在地址栏上出现参数的信息,需要进行参数的隐藏跳转.由于时间比较急,本人没来得及开发一 ...
- Spring IoC和AOP使用扩展
Spring提供了设值注入,构造注入等依赖注入方式. 使用p命令空间可以简化属性注入的配置. Spring提供的增强处理类型包括前置增强,异常抛出增强,环绕增强,最终增强等. 通过Schema形式将P ...