Go:一个可能导致锁失效的坑
先看代码:
package main import(
"sync" )
var hclock sync.RWMutex func main() {
a := make(map[int]string)
a[0] = "z"
a[1] = "a"
a[2] = "b"
a[3] = "c"
for i:=0; i< 2; i++{
// go write(a,i)
go func(b map[int]string){
hclock.Lock()
b[i] = "aaa"
hclock.Unlock()
}(a)
} }
如果这样子是会报错的
报错如下:

说在抢占数据
这就很奇怪了 明明加上了的锁的?
经过百般折磨,终于弄清了问题所在
!!!划重点!
并不是锁失效,出现这个的原因是,for里面的i变量每次循环都是同一个,所以其实并不是两个routine在抢资源,而是因为routine里面对i进行了操作
然后主线程又要继续循环,是主线程和子线程在抢i
为了验证这个想法,我把代码改成如下
package main import(
"sync" )
var hclock sync.RWMutex // func write(b map[int]string,i int){
// hclock.Lock()
// b[i] = "aaaaaa"
// hclock.Unlock()
// } func main() {
a := make(map[int]string)
a[0] = "z"
a[1] = "a"
a[2] = "b"
a[3] = "c"
for i:=0; i< 1; i++{
// go write(a,i)
go func(b map[int]string){
hclock.Lock()
b[i] = "aaa"
hclock.Unlock()
}(a)
} }
只起一个,结果还是报错
再来一个更有说服力的版本
package main import(
"sync" )
var hclock sync.RWMutex func write(b map[int]string,i int){
hclock.Lock()
b[i] = "aaaaaa"
hclock.Unlock()
} func main() {
a := make(map[int]string)
a[0] = "z"
a[1] = "a"
a[2] = "b"
a[3] = "c"
for i:=0; i< 1; i++{
go write(a,i)
} }
这样子就不报错了,另起一个函数,因为i是值类型,所以传递到write函数的时候会拷贝一份,就不存和主线程抢占的问题了。
至此,问题解决!
Go:一个可能导致锁失效的坑的更多相关文章
- inline-block间隙问题总结, ,style一个样式后面 多加了一个 分号; 导致 样式失效
1--- 样式最后的{}后面, 不能有分号 ; 2---- display:inline-block 后, 元素间会有间隙 原因: 由换行或者回车导致的. 解决一: 只要把标签写成一行或者标签 ...
- java中锁与@Transactional同时使用导致锁失效的问题
示例代码 @Transactional public void update(int id) { boolean lock = redisLock.lock(id); if (!lock) { thr ...
- 一个项目中:只能存在一个 WebMvcConfigurationSupport (静态文件失效之坑)
一个项目中:只能存在一个 WebMvcConfigurationSupport 在一个项目中WebMvcConfigurationSupport只能存在一个,多个的时候,只有一个会生效. 静态文件访问 ...
- redis分布式锁的这些坑,我怀疑你是假的开发
摘要:用锁遇到过哪些问题? 一.白话分布式 什么是分布式,用最简单的话来说,就是为了较低单个服务器的压力,将功能分布在不同的机器上面:就比如: 本来一个程序员可以完成一个项目:需求->设计-&g ...
- 踩到一个关于分布式锁的非比寻常的BUG!
你好呀,我是歪歪. 提到分布式锁,大家一般都会想到 Redis. 想到 Redis,一部分同学会说到 Redisson. 那么说到 Redisson,就不得不掰扯掰扯一下它的"看门狗&quo ...
- SQL SERVER 中is null 和 is not null 将会导致索引失效吗?
其实本来这个问题没有什么好说的,今天优化的时候遇到一个SQL语句,因为比较有意思,所以我截取.简化了SQL语句,演示给大家看,如下所示 declare @bamboo_Code varchar(3); ...
- Jquery方法load之后导致js失效解决方法
Jquery方法load之后导致js失效解决方法 >>>>>>>>>>>>>>>>>>> ...
- 索引法则--LIKE以%开头会导致索引失效进而转向全表扫描(使用覆盖索引解决)
Mysql 系列文章主页 =============== 1 准备数据 1.1 建表 DROP TABLE IF EXISTS staff; CREATE TABLE IF NOT EXISTS st ...
- iOS开发-iOS 10 由于权限问题导致崩溃的那些坑
iOS开发-iOS 10 由于权限问题导致崩溃的那些坑 6月份的WWDC大会结束有一段时间了,相信很多开发者也是在努力工作的闲时用着Xcode8 Beta版学习着新的特性吧. 使用Xcode8写自己 ...
随机推荐
- Codeforces 402D Upgrading Array:贪心 + 数学
题目链接:http://codeforces.com/problemset/problem/402/D 题意: 给你一个长度为n的数列a[i],又给出了m个“坏质数”b[i]. 定义函数f(s),其中 ...
- Codeforces 897C Nephren gives a riddle:模拟【珂学】
题目链接:http://codeforces.com/contest/897/problem/C 题意: 给你一些字符串: A: [What are you doing at the end of t ...
- mybatis学习(四)
创建mybatis工程 工程目录: 具体步骤: 1.创建sqlMapConfig.xml文件,配置mybatis的运行环境,事物,数据源,加载mapper映射文件等. 2.创建po类(查询或者返回的属 ...
- 英语发音规则---发/i:/的字母及字母组合
英语发音规则---发/i:/的字母及字母组合 一.总结 一句话总结: 1.字母组合ee发/iː/? bee beef see agree week meeting feel sweet free be ...
- 目标检测 — one-stage检测(二)
one-stage检测算法,其不需要region proposal阶段,直接产生物体的类别概率和位置坐标值,经过单次检测即可直接得到最终的检测结果,因此有着更快的检测速度,比较典型的算法如YOLO,S ...
- 第一章 走进Python
目标 了解Python的历史 了解Python的特征 了解Python的应用 掌握Linux下Python开发环境的搭建 理解Windows下Python环境搭建 案例 安装Python,写出第一个P ...
- python生成excel格式座位表
脚本分两个文件: 1.生成二维随机列表:GenerateLocaltion.py 2.将列表导入excel文件:CreateExcel.py 先上GenerateLocaltion.py: impor ...
- 【二叉查找树】03验证是否为二叉查找树【Validate Binary Search Tree】
本质上是递归遍历左右后在与根节点做判断,本质上是后序遍历 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...
- 点分治Day1
树套树Day2暂且搁置...因为Day1的题我各种不会做... 唯一过了一道还是整体二分过的... 我们来一点愉快的算法,先不考虑数据结构这种骚东西了 毕竟还在发烧,就先码码这几天在搞的点分治吧 hx ...
- Oracle 12c 新特性之 temp undo
Oracle 12c R1 之前,临时表生成的undo记录是存储在undo表空间里的,通用表和持久表的undo记录也是类似的.而在 12c R12 的临时 undo 功能中,临时 undo 记录可以存 ...