Merge pull request #29 from A1014280203/master

补充sync.Once描述
This commit is contained in:
Xargin 2017-11-28 14:20:25 +08:00 committed by GitHub
commit c1b0a703bc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -101,6 +101,6 @@ func Icon(name string) image.Image {
}
```
每一次对Do(loadIcons)的调用都会锁定mutex并会检查boolean变量。在第一次调用时boolean变量的值是falseDo会调用loadIcons并会将boolean变量设置为true。随后的调用什么都不会做但是mutex同步会保证loadIcons对内存(这里其实就是指icons变量啦)产生的效果能够对所有goroutine可见。用这种方式来使用sync.Once的话我们能够避免在变量被构建完成之前和其它goroutine共享该变量。
每一次对Do(loadIcons)的调用都会锁定mutex并会检查boolean变量(译注Go1.9中会先判断boolean变量是否为1(true)只有不为1才锁定mutex不再需要每次都锁定mutex)。在第一次调用时boolean变量的值是falseDo会调用loadIcons并会将boolean变量设置为true。随后的调用什么都不会做但是mutex同步会保证loadIcons对内存(这里其实就是指icons变量啦)产生的效果能够对所有goroutine可见。用这种方式来使用sync.Once的话我们能够避免在变量被构建完成之前和其它goroutine共享该变量。
**练习 9.2** 重写2.6.2节中的PopCount的例子使用sync.Once只在第一次需要用到的时候进行初始化。(虽然实际上对PopCount这样很小且高度优化的函数进行同步可能代价没法接受)