From 4283571cf34b566ed027c78e2066b528f2da9e51 Mon Sep 17 00:00:00 2001 From: Hanlei Qin Date: Wed, 6 Dec 2017 00:20:55 +0800 Subject: [PATCH] Update ch9-01.md --- ch9/ch9-01.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch9/ch9-01.md b/ch9/ch9-01.md index 557b732..3bfd8f5 100644 --- a/ch9/ch9-01.md +++ b/ch9/ch9-01.md @@ -110,7 +110,7 @@ var icons = map[string]image.Image{ func Icon(name string) image.Image { return icons[name] } ``` -上面的例子里icons变量在包初始化阶段就已经被赋值了,包的初始化是在程序main函数开始执行之前就完成了的。只要初始化完成了,icons就再也不会修改的或者不变量是本来就并发安全的,这种变量不需要进行同步。不过显然我们没法用这种方法,因为update操作是必要的操作,尤其对于银行账户来说。 +上面的例子里icons变量在包初始化阶段就已经被赋值了,包的初始化是在程序main函数开始执行之前就完成了的。只要初始化完成了,icons就再也不会被修改。数据结构如果从不被修改或是不变量则是并发安全的,无需进行同步。不过显然,如果update操作是必要的,我们就没法用这种方法,比如说银行账户。 第二种避免数据竞争的方法是,避免从多个goroutine访问变量。这也是前一章中大多数程序所采用的方法。例如前面的并发web爬虫(§8.6)的main goroutine是唯一一个能够访问seen map的goroutine,而聊天服务器(§8.10)中的broadcaster goroutine是唯一一个能够访问clients map的goroutine。这些变量都被限定在了一个单独的goroutine中。