golang-标准库(sync/atomic)
这个库是用来保证并发编程数据安全的。提供了对数据进行原子性操作的方法。
初学者对数据的原子性操作不是太理解,sync包的锁就可以保证并发数据的安全,为什么atomic包也可以保证并发的数据安全,它跟加锁的区别又是什么。
简单说一下,锁是编程语言层面提供的保证数据并发安全的一种方式,而原子性的操作函数是操作系统层面提供的方式,C语言中也有_Atomic关键字,也是用来保证并发编程安全的。下面通过例子来认识一下
首先unsafe包的内容并不多,只有寥寥几个数据结构和函数。要使用unsafe包需要先了解内存对齐,对有c使用经验的朋友就比较简单了。数据在内存的存储并不是连续按着存放的,而是按照一定的对齐规则。使用对齐规则有一个最大的好处是避免cpu的二次读取,也就是说对齐后的数据cpu只需要读取一次。(此处不再细述原因,作者目前的知识层面也就到这儿,原因就是计算机的底层知识了)
unsafe,顾名思义,是不安全的,Go定义这个包名也是这个意思,让我们尽可能的不要使用它,如果你使用它,看到了这个名字,也会想到尽可能的不要使用它,或者更小心的使用它。
虽然这个包不安全,但是它也有它的优势,那就是可以绕过Go的内存安全机制,直接对内存进行读写,所以有时候因为性能的需要,会冒一些风险使用该包,对内存进行操作。在go的标准库中也有使用unsafe包的操作(比如:sync,runtime包等)