前序
在并发编程,尤其是Golang中多协程编程中,数据的一致性和安全性是一个必须要解决的难度。这里面最重要的是通过锁机制来解决这些问题,锁包括CAS,互斥锁,消息队列,分布式锁来解决。但是对于锁的底层实现,知之甚少,这里就是来探讨锁机制的底层实现。
一.锁的场景实例
我们在使用Golang的过程中,经常会使用到并发处理问题的情况。在网络编程中处理消息,或者在应用层面通过并发处理提高解决问题的能力,并行处理多个任务。但是在实际使用中,并发处理有很多问题。
全局共享数据的问题,我们可以看以下示例:
这是很典型的数据冲突的问题。因为两个协程并发执行,并不能保证num的一致性,导致结果如下:
预期值:20000 实际结果: 不确定
简单理解如下
由此可见 数据一致性出现了问题 解决方式如下
输出结果为:
通过锁让协程并发执行,解决数据一致性的问题
另外一个问题:
代码中可以看到,我们对map进行的同时读写操作
运行结果如下: