Golang的包级别变量是线程安全的吗?

huangapple go评论87阅读模式
英文:

Golang are package block variables thread safe?

问题

根据Go规范:

“在顶层(任何函数之外)声明的常量、类型、变量或函数(但不包括方法)的标识符所表示的范围是包块。”

包块变量是否线程安全?例如,如果我有一个包块变量用于存储Web应用程序的当前用户:

var CurrentUser *string

请求1到达:将CurrentUser设置为“John”
请求2到达:将CurrentUser设置为“Fred”

在请求1中,CurrentUser的值是什么?

英文:

According to the Go spec:

"The scope of an identifier denoting a constant, type, variable, or function (but not method) declared at top level (outside any function) is the package block."

Are package block variables thread safe? E.G. If I have a package block variable to store the current user for a web app:

var CurrentUser *string

Request 1 comes in: Set CurrentUser to "John"
Request 2 comes in: Set CurrentUser to "Fred"

In Request 1 what is the value of CurrentUser?

答案1

得分: 5

不,包变量不是线程安全的。

在你的例子中,CurrentUser 可以在任何时候从 "John" 改变为 "Fred",尽管处理请求 1 的 goroutine 不一定会看到这个变化。

因此,你需要使用局部变量来存储对于不同的 goroutine 不同的数据。

英文:

No, package variables are not thread safe.

In your example, CurrentUser could change from "John" to "Fred" at any time—although the goroutine handling Request 1 is not guaranteed to see the change.

So you need to use a local variable to store any data that is different for different goroutines.

huangapple
  • 本文由 发表于 2014年1月5日 01:25:14
  • 转载请务必保留本文链接:https://go.coder-hub.com/20924192.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定