第一章:并发概述
1、Amdahl定律:使用并行方式可以解决的问题,可以使用这种方法对其潜在的性能收益进行建模。简言之,它指出,收益的限制取决于有多少程序必须以顺序的方式编写。
2、竞争条件:当两个或者多个操作必须按正确的顺序执行,而程序并未保证这个顺序就会发生竞争条件。
大多数情况下,这将在所谓的数据中出现,其中一个并发操作尝试读取一个变量,而在某个不确定的时间,另一个并发操作试图写入同一个变量。
竞争条件是最难发现的并发bug类型之一。
3、原子性:意味着在它运行的环境中,它是不可分割的或不可中断的。原子性隐含的意思是它在并发环境中是安全的。
操作的原子性可以根据当前定义的范围而改变。
如果一个数据存在竞争,那么改程序的输出将是完全不确定的。
4、内存访问同步:程序中需要独占访问共享资源的部分有一个专有名词,叫临界区。
LOCK和UNLOCK虽解决了数据竞争,但并没有真正解决我们的竞争条件。lock的调用会使程序变慢,它也可能造成维护和性能问题。
5、死锁程序是所有并发进程彼此等待的程序。在这种情况下,如果没有外界的干预,这个程序将永远无法恢复。
Coffman条件是帮助检测、防止和纠正死锁的技术依据。
Coffman条件如下:
相互排斥:并发进程同时拥有资源的独占权
等待条件:并发进程必须同时拥有一个资源,并等待额外的资源。
没有抢占:并发进程拥有的资源只能被该进程释放,即可满足这个条件。
循环等待:一个并发进程(P1)必须等待一系列其他并发进程(P2),这些并发进程同时也在等待进程(P1),这样便满足了这个最终条件。
6、活锁:活锁是正在主动执行并发操作的程序,但是这些操作无法向前推进程序的状态。
7、内存溢出申请内存时,没有足够的内存空间供它使用。内存泄漏:申请内存后没有释放已申请的内存空间。
8、如果不关心并发 操作的结果,或者你有其他方法来手机它们的结果时,WaitGroup是等待并发操作完成的好方法。
如果这两个条件都不满足,建议使用channel和select语句。
可将WaitGroup视为一个并发安全的计数器:调用通过传入的整数执行add方法增加计数器的增量,并调用Done方法对计数器今夕递减。Wait阻塞,直到计数器为零。
9、临界区是程序中需要独占访问共享资源的区域。Mutex提供了一种安全的方式来表示对这些共享资源的独占访问。进入和退出临界区是有消耗的,需尽量减少在临界区的时间,互斥锁的策略是减少临界区的范围。
sync.RWMutex在概念上和互斥是一样的:它保护着对内存的访问。任意数量的读消费者可以持有一个读锁,只要没有其他事物持有一个写锁。
10、sync.Once是一种类型,它在内部使用一些sync原语,以确保即使在不同的goroutine上,也只会调用一次Do方法处理传递进来的方法。
sync只计算调用Do方法的次数,而不是多少次唯一调用Do方法。