瀏覽代碼

synchronize access to the cache

the docs say that access from multiple goroutines is undefined.
Lucas Stadler 11 年之前
父節點
當前提交
e76bc4639b
共有 1 個文件被更改,包括 6 次插入0 次删除
  1. 6 0
      go/favicon.go

+ 6 - 0
go/favicon.go

@ -8,9 +8,11 @@ import (
8 8
	"net/http"
9 9
	"net/url"
10 10
	"os"
11
	"sync"
11 12
)
12 13
13 14
var faviconCache = make(map[string]string)
15
var lock sync.RWMutex
14 16
15 17
func main() {
16 18
	http.HandleFunc("/favicon", HandleGetFavicon)
@ -47,7 +49,9 @@ func GetFaviconCached(u string) (string, error) {
47 49
	} else {
48 50
		host = parsed.Host
49 51
	}
52
	lock.RLock()
50 53
	faviconUrl, cached := faviconCache[host]
54
	lock.RUnlock()
51 55
52 56
	if cached {
53 57
		return faviconUrl, nil
@ -58,7 +62,9 @@ func GetFaviconCached(u string) (string, error) {
58 62
		return faviconUrl, err
59 63
	}
60 64
65
	lock.Lock()
61 66
	faviconCache[host] = faviconUrl
67
	lock.Unlock()
62 68
	return faviconUrl, nil
63 69
}
64 70