blob: 45ee0f53f2b04582ffb7a80e109b2a80d1f2a369 [file] [log] [blame]
Robert Griesemer53440da2009-10-01 14:08:00 -07001<!-- The Go Memory Model -->
Robert Griesemer18333f22011-06-10 12:31:10 -07002<!-- subtitle Version of June 10, 2011 -->
Russ Cox82c38cf2009-02-20 15:35:20 -08003
Russ Cox9f03d4a2011-05-16 17:03:51 -04004<style>
5p.rule {
6 font-style: italic;
7}
8span.event {
9 font-style: italic;
10}
11</style>
12
Russ Cox82c38cf2009-02-20 15:35:20 -080013<h2>Introduction</h2>
14
15<p>
16The Go memory model specifies the conditions under which
17reads of a variable in one goroutine can be guaranteed to
18observe values produced by writes to the same variable in a different goroutine.
19</p>
20
21<h2>Happens Before</h2>
22
23<p>
24Within a single goroutine, reads and writes must behave
25as if they executed in the order specified by the program.
26That is, compilers and processors may reorder the reads and writes
27executed within a single goroutine only when the reordering
Rob Pike4e5296d2009-11-01 20:58:33 -080028does not change the behavior within that goroutine
29as defined by the language specification.
Russ Cox82c38cf2009-02-20 15:35:20 -080030Because of this reordering, the execution order observed
Rob Pike4e5296d2009-11-01 20:58:33 -080031by one goroutine may differ from the order perceived
Russ Cox82c38cf2009-02-20 15:35:20 -080032by another. For example, if one goroutine
Rob Pike4e5296d2009-11-01 20:58:33 -080033executes <code>a = 1; b = 2;</code>, another might observe
Russ Cox82c38cf2009-02-20 15:35:20 -080034the updated value of <code>b</code> before the updated value of <code>a</code>.
35</p>
36
37<p>
Rob Pike4e5296d2009-11-01 20:58:33 -080038To specify the requirements of reads and writes, we define
Russ Cox82c38cf2009-02-20 15:35:20 -080039<i>happens before</i>, a partial order on the execution
40of memory operations in a Go program. If event <span class="event">e<sub>1</sub></span> happens
41before event <span class="event">e<sub>2</sub></span>, then we say that <span class="event">e<sub>2</sub></span> happens after <span class="event">e<sub>1</sub></span>.
42Also, if <span class="event">e<sub>1</sub></span> does not happen before <span class="event">e<sub>2</sub></span> and does not happen
43after <span class="event">e<sub>2</sub></span>, then we say that <span class="event">e<sub>1</sub></span> and <span class="event">e<sub>2</sub></span> happen concurrently.
44</p>
45
Robert Griesemer18333f22011-06-10 12:31:10 -070046<p class="rule">
47Within a single goroutine, the happens-before order is the
Rob Pike4e5296d2009-11-01 20:58:33 -080048order expressed by the program.
Russ Cox82c38cf2009-02-20 15:35:20 -080049</p>
50
51<p>
52A read <span class="event">r</span> of a variable <code>v</code> is <i>allowed</i> to observe a write <span class="event">w</span> to <code>v</code>
53if both of the following hold:
54</p>
55
56<ol>
Russ Cox44d13e32011-09-26 12:54:30 -040057<li><span class="event">r</span> does not happen before <span class="event">w</span>.</li>
Russ Cox82c38cf2009-02-20 15:35:20 -080058<li>There is no other write <span class="event">w'</span> to <code>v</code> that happens
59 after <span class="event">w</span> but before <span class="event">r</span>.</li>
60</ol>
61
62<p>
63To guarantee that a read <span class="event">r</span> of a variable <code>v</code> observes a
64particular write <span class="event">w</span> to <code>v</code>, ensure that <span class="event">w</span> is the only
65write <span class="event">r</span> is allowed to observe.
66That is, <span class="event">r</span> is <i>guaranteed</i> to observe <span class="event">w</span> if both of the following hold:
67</p>
68
69<ol>
70<li><span class="event">w</span> happens before <span class="event">r</span>.</li>
71<li>Any other write to the shared variable <code>v</code>
72either happens before <span class="event">w</span> or after <span class="event">r</span>.</li>
73</ol>
74
75<p>
76This pair of conditions is stronger than the first pair;
77it requires that there are no other writes happening
78concurrently with <span class="event">w</span> or <span class="event">r</span>.
79</p>
80
81<p>
82Within a single goroutine,
83there is no concurrency, so the two definitions are equivalent:
84a read <span class="event">r</span> observes the value written by the most recent write <span class="event">w</span> to <code>v</code>.
85When multiple goroutines access a shared variable <code>v</code>,
86they must use synchronization events to establish
87happens-before conditions that ensure reads observe the
88desired writes.
89</p>
90
91<p>
92The initialization of variable <code>v</code> with the zero value
93for <code>v</code>'s type behaves as a write in the memory model.
94</p>
95
96<p>
97Reads and writes of values larger than a single machine word
98behave as multiple machine-word-sized operations in an
99unspecified order.
100</p>
101
102<h2>Synchronization</h2>
103
104<h3>Initialization</h3>
105
106<p>
Rob Pike4e5296d2009-11-01 20:58:33 -0800107Program initialization runs in a single goroutine and
Russ Cox82c38cf2009-02-20 15:35:20 -0800108new goroutines created during initialization do not
109start running until initialization ends.
110</p>
111
112<p class="rule">
113If a package <code>p</code> imports package <code>q</code>, the completion of
114<code>q</code>'s <code>init</code> functions happens before the start of any of <code>p</code>'s.
115</p>
116
117<p class="rule">
118The start of the function <code>main.main</code> happens after
119all <code>init</code> functions have finished.
120</p>
121
122<p class="rule">
123The execution of any goroutines created during <code>init</code>
124functions happens after all <code>init</code> functions have finished.
125</p>
126
127<h3>Goroutine creation</h3>
128
129<p class="rule">
130The <code>go</code> statement that starts a new goroutine
131happens before the goroutine's execution begins.
132</p>
133
134<p>
135For example, in this program:
136</p>
137
138<pre>
David Symondscc99ba02010-04-06 11:14:44 +1000139var a string
Russ Cox82c38cf2009-02-20 15:35:20 -0800140
141func f() {
David Symondscc99ba02010-04-06 11:14:44 +1000142 print(a)
Russ Cox82c38cf2009-02-20 15:35:20 -0800143}
144
145func hello() {
David Symondscc99ba02010-04-06 11:14:44 +1000146 a = "hello, world"
147 go f()
Russ Cox82c38cf2009-02-20 15:35:20 -0800148}
149</pre>
150
151<p>
152calling <code>hello</code> will print <code>"hello, world"</code>
153at some point in the future (perhaps after <code>hello</code> has returned).
154</p>
155
Russ Cox7ff68b32010-12-13 17:08:27 -0500156<h3>Goroutine destruction</h3>
157
158<p>
159The exit of a goroutine is not guaranteed to happen before
160any event in the program. For example, in this program:
161</p>
162
163<pre>
164var a string
165
166func hello() {
167 go func() { a = "hello" }()
168 print(a)
169}
170</pre>
171
172<p>
173the assignment to <code>a</code> is not followed by
174any synchronization event, so it is not guaranteed to be
175observed by any other goroutine.
176In fact, an aggressive compiler might delete the entire <code>go</code> statement.
177</p>
178
179<p>
180If the effects of a goroutine must be observed by another goroutine,
181use a synchronization mechanism such as a lock or channel
Russ Cox43f459c2010-12-14 11:33:17 -0500182communication to establish a relative ordering.
Russ Cox7ff68b32010-12-13 17:08:27 -0500183</p>
184
Russ Cox82c38cf2009-02-20 15:35:20 -0800185<h3>Channel communication</h3>
186
187<p>
188Channel communication is the main method of synchronization
189between goroutines. Each send on a particular channel
190is matched to a corresponding receive from that channel,
191usually in a different goroutine.
192</p>
193
194<p class="rule">
195A send on a channel happens before the corresponding
196receive from that channel completes.
197</p>
198
199<p>
Rob Pike4e5296d2009-11-01 20:58:33 -0800200This program:
Russ Cox82c38cf2009-02-20 15:35:20 -0800201</p>
202
203<pre>
Rob Pike4e5296d2009-11-01 20:58:33 -0800204var c = make(chan int, 10)
205var a string
Russ Cox82c38cf2009-02-20 15:35:20 -0800206
207func f() {
David Symondscc99ba02010-04-06 11:14:44 +1000208 a = "hello, world"
209 c &lt;- 0
Russ Cox82c38cf2009-02-20 15:35:20 -0800210}
211
212func main() {
David Symondscc99ba02010-04-06 11:14:44 +1000213 go f()
214 &lt;-c
215 print(a)
Russ Cox82c38cf2009-02-20 15:35:20 -0800216}
217</pre>
218
219<p>
220is guaranteed to print <code>"hello, world"</code>. The write to <code>a</code>
221happens before the send on <code>c</code>, which happens before
222the corresponding receive on <code>c</code> completes, which happens before
223the <code>print</code>.
224</p>
225
226<p class="rule">
Russ Cox9f03d4a2011-05-16 17:03:51 -0400227The closing of a channel happens before a receive that returns a zero value
228because the channel is closed.
229</p>
230
231<p>
232In the previous example, replacing
233<code>c &lt;- 0</code> with <code>close(c)</code>
234yields a program with the same guaranteed behavior.
235</p>
236
237<p class="rule">
Russ Cox82c38cf2009-02-20 15:35:20 -0800238A receive from an unbuffered channel happens before
239the send on that channel completes.
240</p>
241
242<p>
Andrew Gerrand2551cf92010-02-22 16:51:28 -0800243This program (as above, but with the send and receive statements swapped and
244using an unbuffered channel):
Russ Cox82c38cf2009-02-20 15:35:20 -0800245</p>
246
247<pre>
Rob Pike4e5296d2009-11-01 20:58:33 -0800248var c = make(chan int)
249var a string
Russ Cox82c38cf2009-02-20 15:35:20 -0800250
251func f() {
David Symondscc99ba02010-04-06 11:14:44 +1000252 a = "hello, world"
253 &lt;-c
Russ Cox82c38cf2009-02-20 15:35:20 -0800254}
255</pre>
256
257<pre>
258func main() {
David Symondscc99ba02010-04-06 11:14:44 +1000259 go f()
260 c &lt;- 0
261 print(a)
Russ Cox82c38cf2009-02-20 15:35:20 -0800262}
263</pre>
264
265<p>
Rob Pike4e5296d2009-11-01 20:58:33 -0800266is also guaranteed to print <code>"hello, world"</code>. The write to <code>a</code>
Russ Cox82c38cf2009-02-20 15:35:20 -0800267happens before the receive on <code>c</code>, which happens before
268the corresponding send on <code>c</code> completes, which happens
269before the <code>print</code>.
270</p>
271
272<p>
273If the channel were buffered (e.g., <code>c = make(chan int, 1)</code>)
274then the program would not be guaranteed to print
275<code>"hello, world"</code>. (It might print the empty string;
Andrew Gerrand2551cf92010-02-22 16:51:28 -0800276it cannot print <code>"goodbye, universe"</code>, nor can it crash.)
Russ Cox82c38cf2009-02-20 15:35:20 -0800277</p>
278
279<h3>Locks</h3>
280
281<p>
282The <code>sync</code> package implements two lock data types,
283<code>sync.Mutex</code> and <code>sync.RWMutex</code>.
284</p>
285
286<p class="rule">
Russ Cox830813f2009-11-08 21:08:27 -0800287For any <code>sync.Mutex</code> or <code>sync.RWMutex</code> variable <code>l</code> and <i>n</i> &lt; <i>m</i>,
Russ Cox82c38cf2009-02-20 15:35:20 -0800288the <i>n</i>'th call to <code>l.Unlock()</code> happens before the <i>m</i>'th call to <code>l.Lock()</code> returns.
289</p>
290
291<p>
Rob Pike4e5296d2009-11-01 20:58:33 -0800292This program:
Russ Cox82c38cf2009-02-20 15:35:20 -0800293</p>
294
295<pre>
Rob Pike4e5296d2009-11-01 20:58:33 -0800296var l sync.Mutex
297var a string
Russ Cox82c38cf2009-02-20 15:35:20 -0800298
299func f() {
David Symondscc99ba02010-04-06 11:14:44 +1000300 a = "hello, world"
301 l.Unlock()
Russ Cox82c38cf2009-02-20 15:35:20 -0800302}
303
304func main() {
David Symondscc99ba02010-04-06 11:14:44 +1000305 l.Lock()
306 go f()
307 l.Lock()
308 print(a)
Russ Cox82c38cf2009-02-20 15:35:20 -0800309}
310</pre>
311
312<p>
313is guaranteed to print <code>"hello, world"</code>.
314The first call to <code>l.Unlock()</code> (in <code>f</code>) happens
315before the second call to <code>l.Lock()</code> (in <code>main</code>) returns,
316which happens before the <code>print</code>.
317</p>
318
Russ Cox830813f2009-11-08 21:08:27 -0800319<p class="rule">
320For any call to <code>l.RLock</code> on a <code>sync.RWMutex</code> variable <code>l</code>,
321there is an <i>n</i> such that the <code>l.RLock</code> happens (returns) after the <i>n</i>'th call to
322<code>l.Unlock</code> and the matching <code>l.RUnlock</code> happens
323before the <i>n</i>+1'th call to <code>l.Lock</code>.
Russ Cox82c38cf2009-02-20 15:35:20 -0800324</p>
325
326<h3>Once</h3>
327
328<p>
Rob Pikeb6ad32b2010-09-20 07:37:41 +1000329The <code>sync</code> package provides a safe mechanism for
330initialization in the presence of multiple goroutines
331through the use of the <code>Once</code> type.
Russ Cox82c38cf2009-02-20 15:35:20 -0800332Multiple threads can execute <code>once.Do(f)</code> for a particular <code>f</code>,
333but only one will run <code>f()</code>, and the other calls block
334until <code>f()</code> has returned.
335</p>
336
Rob Pike4e5296d2009-11-01 20:58:33 -0800337<p class="rule">
338A single call of <code>f()</code> from <code>once.Do(f)</code> happens (returns) before any call of <code>once.Do(f)</code> returns.
Russ Cox82c38cf2009-02-20 15:35:20 -0800339</p>
340
341<p>
Rob Pike4e5296d2009-11-01 20:58:33 -0800342In this program:
Russ Cox82c38cf2009-02-20 15:35:20 -0800343</p>
344
345<pre>
Rob Pike4e5296d2009-11-01 20:58:33 -0800346var a string
Rob Pikeb6ad32b2010-09-20 07:37:41 +1000347var once sync.Once
Russ Cox82c38cf2009-02-20 15:35:20 -0800348
349func setup() {
David Symondscc99ba02010-04-06 11:14:44 +1000350 a = "hello, world"
Russ Cox82c38cf2009-02-20 15:35:20 -0800351}
352
353func doprint() {
David Symondscc99ba02010-04-06 11:14:44 +1000354 once.Do(setup)
355 print(a)
Russ Cox82c38cf2009-02-20 15:35:20 -0800356}
357
358func twoprint() {
David Symondscc99ba02010-04-06 11:14:44 +1000359 go doprint()
360 go doprint()
Russ Cox82c38cf2009-02-20 15:35:20 -0800361}
362</pre>
363
364<p>
365calling <code>twoprint</code> causes <code>"hello, world"</code> to be printed twice.
366The first call to <code>twoprint</code> runs <code>setup</code> once.
367</p>
368
369<h2>Incorrect synchronization</h2>
370
371<p>
372Note that a read <span class="event">r</span> may observe the value written by a write <span class="event">w</span>
373that happens concurrently with <span class="event">r</span>.
374Even if this occurs, it does not imply that reads happening after <span class="event">r</span>
375will observe writes that happened before <span class="event">w</span>.
376</p>
377
378<p>
Rob Pike4e5296d2009-11-01 20:58:33 -0800379In this program:
Russ Cox82c38cf2009-02-20 15:35:20 -0800380</p>
381
382<pre>
Rob Pike4e5296d2009-11-01 20:58:33 -0800383var a, b int
Russ Cox82c38cf2009-02-20 15:35:20 -0800384
385func f() {
David Symondscc99ba02010-04-06 11:14:44 +1000386 a = 1
387 b = 2
Russ Cox82c38cf2009-02-20 15:35:20 -0800388}
389
390func g() {
David Symondscc99ba02010-04-06 11:14:44 +1000391 print(b)
392 print(a)
Russ Cox82c38cf2009-02-20 15:35:20 -0800393}
394
395func main() {
David Symondscc99ba02010-04-06 11:14:44 +1000396 go f()
397 g()
Russ Cox82c38cf2009-02-20 15:35:20 -0800398}
399</pre>
400
401<p>
402it can happen that <code>g</code> prints <code>2</code> and then <code>0</code>.
403</p>
404
405<p>
Rob Pike4e5296d2009-11-01 20:58:33 -0800406This fact invalidates a few common idioms.
Russ Cox82c38cf2009-02-20 15:35:20 -0800407</p>
408
409<p>
410Double-checked locking is an attempt to avoid the overhead of synchronization.
Rob Pike4e5296d2009-11-01 20:58:33 -0800411For example, the <code>twoprint</code> program might be
Russ Cox82c38cf2009-02-20 15:35:20 -0800412incorrectly written as:
413</p>
414
415<pre>
Rob Pike4e5296d2009-11-01 20:58:33 -0800416var a string
417var done bool
Russ Cox82c38cf2009-02-20 15:35:20 -0800418
419func setup() {
David Symondscc99ba02010-04-06 11:14:44 +1000420 a = "hello, world"
421 done = true
Russ Cox82c38cf2009-02-20 15:35:20 -0800422}
423
424func doprint() {
425 if !done {
David Symondscc99ba02010-04-06 11:14:44 +1000426 once.Do(setup)
Russ Cox82c38cf2009-02-20 15:35:20 -0800427 }
David Symondscc99ba02010-04-06 11:14:44 +1000428 print(a)
Russ Cox82c38cf2009-02-20 15:35:20 -0800429}
430
431func twoprint() {
David Symondscc99ba02010-04-06 11:14:44 +1000432 go doprint()
433 go doprint()
Russ Cox82c38cf2009-02-20 15:35:20 -0800434}
435</pre>
436
437<p>
438but there is no guarantee that, in <code>doprint</code>, observing the write to <code>done</code>
439implies observing the write to <code>a</code>. This
440version can (incorrectly) print an empty string
441instead of <code>"hello, world"</code>.
442</p>
443
444<p>
445Another incorrect idiom is busy waiting for a value, as in:
446</p>
447
448<pre>
Rob Pike4e5296d2009-11-01 20:58:33 -0800449var a string
450var done bool
Russ Cox82c38cf2009-02-20 15:35:20 -0800451
452func setup() {
David Symondscc99ba02010-04-06 11:14:44 +1000453 a = "hello, world"
454 done = true
Russ Cox82c38cf2009-02-20 15:35:20 -0800455}
456
457func main() {
David Symondscc99ba02010-04-06 11:14:44 +1000458 go setup()
Russ Cox82c38cf2009-02-20 15:35:20 -0800459 for !done {
460 }
David Symondscc99ba02010-04-06 11:14:44 +1000461 print(a)
Russ Cox82c38cf2009-02-20 15:35:20 -0800462}
463</pre>
464
465<p>
466As before, there is no guarantee that, in <code>main</code>,
Rob Pike4e5296d2009-11-01 20:58:33 -0800467observing the write to <code>done</code>
Russ Cox82c38cf2009-02-20 15:35:20 -0800468implies observing the write to <code>a</code>, so this program could
469print an empty string too.
470Worse, there is no guarantee that the write to <code>done</code> will ever
471be observed by <code>main</code>, since there are no synchronization
472events between the two threads. The loop in <code>main</code> is not
473guaranteed to finish.
474</p>
475
476<p>
Rob Pike4e5296d2009-11-01 20:58:33 -0800477There are subtler variants on this theme, such as this program.
Russ Cox82c38cf2009-02-20 15:35:20 -0800478</p>
479
480<pre>
481type T struct {
David Symondscc99ba02010-04-06 11:14:44 +1000482 msg string
Russ Cox82c38cf2009-02-20 15:35:20 -0800483}
484
Rob Pike4e5296d2009-11-01 20:58:33 -0800485var g *T
Russ Cox82c38cf2009-02-20 15:35:20 -0800486
487func setup() {
David Symondscc99ba02010-04-06 11:14:44 +1000488 t := new(T)
489 t.msg = "hello, world"
490 g = t
Russ Cox82c38cf2009-02-20 15:35:20 -0800491}
492
493func main() {
David Symondscc99ba02010-04-06 11:14:44 +1000494 go setup()
Russ Cox82c38cf2009-02-20 15:35:20 -0800495 for g == nil {
496 }
David Symondscc99ba02010-04-06 11:14:44 +1000497 print(g.msg)
Russ Cox82c38cf2009-02-20 15:35:20 -0800498}
499</pre>
500
501<p>
502Even if <code>main</code> observes <code>g != nil</code> and exits its loop,
503there is no guarantee that it will observe the initialized
504value for <code>g.msg</code>.
505</p>
506
507<p>
508In all these examples, the solution is the same:
509use explicit synchronization.
510</p>