先看代码:

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. java:eclipse安装tomcat插件及配置tomcat

    我们都知道myeclipse自带tomat图标,而eclipse却没有,若想eclipse实现带有tomcat图标可以下载tomcat插件 tomcat插件下载地址:http://www.eclips ...

  2. C# 往excel出力数据

    /// <summary> /// 出力Excel /// </summary> /// <param name="storeModelForExcel&quo ...

  3. MySQL丨删除一张表小常识

    在MySQL里面 ,对于删除一张表里面的所有内容有两种语句: 1.delete from table_name; 2.truncate table table_name; 解析:以上两种方式都可以删除 ...

  4. STL stl_uninitialized.h

    stl_uninitialized.h // Filename: stl_uninitialized.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com ...

  5. 使用NSURLProtocol和NSURLSession拦截UIWebView的HTTP请求(包括ajax请求)

    问题:服务器端有一个网站需要AD认证,整站都开了Basic认证,包括图片,CSS等资源,我在HTTP请求头里面添加认证所需的用户名和密码,传递到服务器端可以认证通过.我在UIWebView的shoul ...

  6. 【转】 Pro Android学习笔记(三八):Fragment(3):基础小例子-续

    目录(?)[-] Step 2实现Fragment指定调用类TitleFragment onInflate和onAttach onCreate和onCreateView onActivityCreat ...

  7. JSP标签和EL表达式

    1.jsp标签: sun原生的,直接jsp使用 <jsp:include> -- 实现页面包含,动态包含 <jsp:include page="/index.jsp&quo ...

  8. Java常见设计模式之代理模式

    指由一个代理主题来操作真实主题,真实主题执行具体的业务操作,而代理主题负责其它相关业务的处理.比如生活中的通过代理访问网络,客户通过网络代理连接网络(具体业务),由代理服务器完成用户权限和访问限制等与 ...

  9. tomcat安装与运行

    实验环境:CentOS7 使用系统yum仓库安装: #安装基本包和开发工具包 [root@~ localhost]#yum install -y java-1.8.0-openjdk java-1.8 ...

  10. PHP二维数组,根据多个字段来排序

    如果是最最常见的二维数组排序, 大多数情况下也只用到二维: 用php内置函数 array_multisort( )  是最简单的: <?php 假设, $arr 是一个二维数组, $arg1是取 ...