「28」sync-mutex传参复制问题
¶Go version:
1 | 7384 ◯ go version |
¶起因:
1 | sync.Mutex当参数,值传递后出错. |
¶现象:
不废话,上代码:
1 |
|
¶这个age的输出应该是多少?
¶不妨可以多尝试几次,结果:
100/99/98都有可能.
¶What? Lock难道不是加锁的么
Lock加锁难道不是这么用的么,颠覆认知!
¶Lock源码:
A Mutex must not be copied after first use
¶根源:
- Go参数传递属于值传递
- Mutex复制后中的state属于前一状态,没有改变
- Mutex中的Lock和Unlock「方法」属于指针类型图1
¶解决办法
- 当然是参考源码,「图1」
1 |
|
- 加锁的地方尽量是全局的
1 | 这个就不分析了,毕竟不适用所有场景. |
¶Sync包不可复制性
1 | 使用sync包下的功能,可能得注意了,都是不可复制的. |
¶End
每次看源码,都会有不一样的收获.「也许是我理解能力差哈」