先看代码:

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:一个可能导致锁失效的坑的更多相关文章

  1. inline-block间隙问题总结, ,style一个样式后面 多加了一个 分号; 导致 样式失效

    1--- 样式最后的{}后面, 不能有分号 ; 2---- display:inline-block 后, 元素间会有间隙    原因:  由换行或者回车导致的. 解决一: 只要把标签写成一行或者标签 ...

  2. java中锁与@Transactional同时使用导致锁失效的问题

    示例代码 @Transactional public void update(int id) { boolean lock = redisLock.lock(id); if (!lock) { thr ...

  3. 一个项目中:只能存在一个 WebMvcConfigurationSupport (静态文件失效之坑)

    一个项目中:只能存在一个 WebMvcConfigurationSupport 在一个项目中WebMvcConfigurationSupport只能存在一个,多个的时候,只有一个会生效. 静态文件访问 ...

  4. redis分布式锁的这些坑,我怀疑你是假的开发

    摘要:用锁遇到过哪些问题? 一.白话分布式 什么是分布式,用最简单的话来说,就是为了较低单个服务器的压力,将功能分布在不同的机器上面:就比如: 本来一个程序员可以完成一个项目:需求->设计-&g ...

  5. 踩到一个关于分布式锁的非比寻常的BUG!

    你好呀,我是歪歪. 提到分布式锁,大家一般都会想到 Redis. 想到 Redis,一部分同学会说到 Redisson. 那么说到 Redisson,就不得不掰扯掰扯一下它的"看门狗&quo ...

  6. SQL SERVER 中is null 和 is not null 将会导致索引失效吗?

    其实本来这个问题没有什么好说的,今天优化的时候遇到一个SQL语句,因为比较有意思,所以我截取.简化了SQL语句,演示给大家看,如下所示 declare @bamboo_Code varchar(3); ...

  7. Jquery方法load之后导致js失效解决方法

    Jquery方法load之后导致js失效解决方法 >>>>>>>>>>>>>>>>>>> ...

  8. 索引法则--LIKE以%开头会导致索引失效进而转向全表扫描(使用覆盖索引解决)

    Mysql 系列文章主页 =============== 1 准备数据 1.1 建表 DROP TABLE IF EXISTS staff; CREATE TABLE IF NOT EXISTS st ...

  9. iOS开发-iOS 10 由于权限问题导致崩溃的那些坑

     iOS开发-iOS 10 由于权限问题导致崩溃的那些坑 6月份的WWDC大会结束有一段时间了,相信很多开发者也是在努力工作的闲时用着Xcode8 Beta版学习着新的特性吧. 使用Xcode8写自己 ...

随机推荐

  1. Codeforces 900D Unusual Sequences:记忆化搜索

    题目链接:http://codeforces.com/problemset/problem/900/D 题意: 给定x,y,问你有多少个数列a满足gcd(a[i]) = x 且 ∑(a[i]) = y ...

  2. Abp模块分析

    1.什么是模块? 模块化是一种处理复杂系统分解为更好的可管理模块的方式.模块化用来分割,组织和打包软件.每个模块完成一个特定的子功能,所有的模块按某种方法组装起来,成为一个整体,完成整个系统所要求的功 ...

  3. nodejs stream & buffer 互相转换

    stream 转 buffer function streamToBuffer(stream) { return new Promise((resolve, reject) => { let b ...

  4. 通知消息与ON_NOTIFY

    1.通知消息一般是由子控件发出,由父窗口响应,因此响应函数的位置在父窗口内. 2.通知消息发送给父窗口的是通知码,即WM_NOTIFY消息(但为了区分方便不同的消息有不同的名称,但都是以WM_NOTI ...

  5. Havel-Hakimi定理(握手定理)

    Havel-Hakimi定理(握手定理) 由非负整数组成的非增序列s(度序列):d1,d2,…,dn(n>=2,d1>=1)是可图的,当且仅当序列: s1:d2 – 1,d3 – 1,…, ...

  6. 【leetcode刷题笔记】Plus One

    Given a non-negative number represented as an array of digits, plus one to the number. The digits ar ...

  7. C++ STL, sort用法。

    在algorithm头文件中的sort可以给任意对象排序,包括内置类型和自定义类型,前提是定义了“<“运算符. sort(begin,end),表示一个范围,例如: #include" ...

  8. Git远程克隆仓库出现Permission denied (publickey)

    $ git clone git@github.com:DavidWanderer/test1.git Cloning into 'test1'... Warning: Permanently adde ...

  9. 差一点搞混了Transactional注解

    今天给我的Srping业务层加如下Service和Transactional注解: @Service @Scope(BeanDefinition.SCOPE_SINGLETON) @Transacti ...

  10. sort,uniq,cut,wc命令详解

    sortsort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出.如果 File 参数指定多个文件,那么 sort 命令将这些文件连接起来,并当作一个文件进行排序. sort语法 s ...