先看代码:

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. window.onload 添加多个函数绑定

    window.onload = function(){alert(2)} function addEvent (fun) { var old = window.onload; if(typeof ol ...

  2. 数据库+maven

    1.mysql <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-ja ...

  3. Redis安装以及基本操作命令

    Redis安装 cd redis-2.6.14make PREFIX=/usr/local/redis install 可能会出现的错误提示>>提示1:make[3]: gcc:命令未找到 ...

  4. Convolutional Neural Networks for Visual Recognition 8

    Convolutional Neural Networks (CNNs / ConvNets) 前面做了如此漫长的铺垫,现在终于来到了课程的重点.Convolutional Neural Networ ...

  5. [转]JS内存泄漏排查方法(Chrome Profiles)

    Google Chrome浏览器提供了非常强大的JS调试工具,Heap Profiling便是其中一个.Heap Profiling可以记录当前的堆内存(heap)快照,并生成对象的描述文件,该描述文 ...

  6. 电子商务网站SQL注入项目实战一例(转载)

    故事A段:发现整站SQL对外输出: 有个朋友的网站,由于是外包项目,深圳某公司开发的,某天我帮他检测了一下网站相关情况. 我查看了页面源代码,发现了个惊人的事情,竟然整站打印SQL到Html里,着实吓 ...

  7. Nmon工具的使用以及通过nmon_analyse生成分析报表

    在我们监控我们的操作系统的时候如果可以把各个硬件的监控信息生成形象化的分析报表图对于我们来说是件太好的事情了,而通过ibm的nom和nmon_analyser两者的结合完全可以实现我们的要求.首先对n ...

  8. 用C语言实现中文到unicode码的转换

    转自:  http://blog.csdn.net/qq_21792169/article/details/50379275 源文件用不同的编码方式编写,会导致执行结果不一样 由于本人喜欢用Notep ...

  9. JS判断提交表单不能为空 等的验证

    转自:https://blog.csdn.net/qiu512300471/article/details/23259811 <script type="text/javascript ...

  10. linux日常管理-防火墙netfilter工具-iptables-2

    分别是包的数量:26  包的字节:1320  处理方式 tcp协议  opt in out  源ip 目标ip 到80端口的行为. 处理行为处理有REJECT外 还有DROP ACCEPT.分别是看一 ...