blob: 5dd48ff7fbdea77ccaba39402f0c0c22fcdc1efe [file] [log] [blame]
Andrew Gerrand7cb21a72012-01-19 11:24:54 +11001<!--{
2 "Title": "The Go Memory Model",
Dmitriy Vyukov81a93ef2014-06-05 21:08:28 +04003 "Subtitle": "Version of May 31, 2014",
Andrew Gerrand48ba6fe2013-10-04 09:45:06 +10004 "Path": "/ref/mem"
Andrew Gerrand7cb21a72012-01-19 11:24:54 +11005}-->
Russ Cox82c38cf2009-02-20 15:35:20 -08006
Russ Cox9f03d4a2011-05-16 17:03:51 -04007<style>
8p.rule {
9 font-style: italic;
10}
11span.event {
12 font-style: italic;
13}
14</style>
15
Russ Cox82c38cf2009-02-20 15:35:20 -080016<h2>Introduction</h2>
17
18<p>
19The Go memory model specifies the conditions under which
20reads of a variable in one goroutine can be guaranteed to
21observe values produced by writes to the same variable in a different goroutine.
22</p>
23
Rob Pike2eb1b652014-10-27 17:08:50 -070024
25<h2>Advice</h2>
26
27<p>
28Programs that modify data being simultaneously accessed by multiple goroutines
29must serialize such access.
30</p>
31
32<p>
33To serialize access, protect the data with channel operations or other synchronization primitives
34such as those in the <a href="/pkg/sync/"><code>sync</code></a>
35and <a href="/pkg/sync/atomic/"><code>sync/atomic</code></a> packages.
36</p>
37
38<p>
39If you must read the rest of this document to understand the behavior of your program,
40you are being too clever.
41</p>
42
43<p>
44Don't be clever.
45</p>
46
Russ Cox82c38cf2009-02-20 15:35:20 -080047<h2>Happens Before</h2>
48
49<p>
50Within a single goroutine, reads and writes must behave
51as if they executed in the order specified by the program.
52That is, compilers and processors may reorder the reads and writes
53executed within a single goroutine only when the reordering
Rob Pike4e5296d2009-11-01 20:58:33 -080054does not change the behavior within that goroutine
55as defined by the language specification.
Russ Cox82c38cf2009-02-20 15:35:20 -080056Because of this reordering, the execution order observed
Rob Pike4e5296d2009-11-01 20:58:33 -080057by one goroutine may differ from the order perceived
Russ Cox82c38cf2009-02-20 15:35:20 -080058by another. For example, if one goroutine
Rob Pike4e5296d2009-11-01 20:58:33 -080059executes <code>a = 1; b = 2;</code>, another might observe
Russ Cox82c38cf2009-02-20 15:35:20 -080060the updated value of <code>b</code> before the updated value of <code>a</code>.
61</p>
62
63<p>
Rob Pike4e5296d2009-11-01 20:58:33 -080064To specify the requirements of reads and writes, we define
Russ Cox82c38cf2009-02-20 15:35:20 -080065<i>happens before</i>, a partial order on the execution
66of memory operations in a Go program. If event <span class="event">e<sub>1</sub></span> happens
67before 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>.
68Also, 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
69after <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.
70</p>
71
Robert Griesemer18333f22011-06-10 12:31:10 -070072<p class="rule">
73Within a single goroutine, the happens-before order is the
Rob Pike4e5296d2009-11-01 20:58:33 -080074order expressed by the program.
Russ Cox82c38cf2009-02-20 15:35:20 -080075</p>
76
77<p>
78A 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>
79if both of the following hold:
80</p>
81
82<ol>
Russ Cox44d13e32011-09-26 12:54:30 -040083<li><span class="event">r</span> does not happen before <span class="event">w</span>.</li>
Russ Cox82c38cf2009-02-20 15:35:20 -080084<li>There is no other write <span class="event">w'</span> to <code>v</code> that happens
85 after <span class="event">w</span> but before <span class="event">r</span>.</li>
86</ol>
87
88<p>
89To guarantee that a read <span class="event">r</span> of a variable <code>v</code> observes a
90particular write <span class="event">w</span> to <code>v</code>, ensure that <span class="event">w</span> is the only
91write <span class="event">r</span> is allowed to observe.
92That is, <span class="event">r</span> is <i>guaranteed</i> to observe <span class="event">w</span> if both of the following hold:
93</p>
94
95<ol>
96<li><span class="event">w</span> happens before <span class="event">r</span>.</li>
97<li>Any other write to the shared variable <code>v</code>
98either happens before <span class="event">w</span> or after <span class="event">r</span>.</li>
99</ol>
100
101<p>
102This pair of conditions is stronger than the first pair;
103it requires that there are no other writes happening
104concurrently with <span class="event">w</span> or <span class="event">r</span>.
105</p>
106
107<p>
108Within a single goroutine,
109there is no concurrency, so the two definitions are equivalent:
110a read <span class="event">r</span> observes the value written by the most recent write <span class="event">w</span> to <code>v</code>.
111When multiple goroutines access a shared variable <code>v</code>,
112they must use synchronization events to establish
113happens-before conditions that ensure reads observe the
114desired writes.
115</p>
116
117<p>
118The initialization of variable <code>v</code> with the zero value
119for <code>v</code>'s type behaves as a write in the memory model.
120</p>
121
122<p>
123Reads and writes of values larger than a single machine word
124behave as multiple machine-word-sized operations in an
125unspecified order.
126</p>
127
128<h2>Synchronization</h2>
129
130<h3>Initialization</h3>
131
132<p>
Shenghou Ma6b770f02012-03-08 03:56:31 +0800133Program initialization runs in a single goroutine,
134but that goroutine may create other goroutines,
135which run concurrently.
Russ Cox82c38cf2009-02-20 15:35:20 -0800136</p>
137
138<p class="rule">
139If a package <code>p</code> imports package <code>q</code>, the completion of
140<code>q</code>'s <code>init</code> functions happens before the start of any of <code>p</code>'s.
141</p>
142
143<p class="rule">
144The start of the function <code>main.main</code> happens after
145all <code>init</code> functions have finished.
146</p>
147
Russ Cox82c38cf2009-02-20 15:35:20 -0800148<h3>Goroutine creation</h3>
149
150<p class="rule">
151The <code>go</code> statement that starts a new goroutine
152happens before the goroutine's execution begins.
153</p>
154
155<p>
156For example, in this program:
157</p>
158
159<pre>
David Symondscc99ba02010-04-06 11:14:44 +1000160var a string
Russ Cox82c38cf2009-02-20 15:35:20 -0800161
162func f() {
David Symondscc99ba02010-04-06 11:14:44 +1000163 print(a)
Russ Cox82c38cf2009-02-20 15:35:20 -0800164}
165
166func hello() {
David Symondscc99ba02010-04-06 11:14:44 +1000167 a = "hello, world"
168 go f()
Russ Cox82c38cf2009-02-20 15:35:20 -0800169}
170</pre>
171
172<p>
173calling <code>hello</code> will print <code>"hello, world"</code>
174at some point in the future (perhaps after <code>hello</code> has returned).
175</p>
176
Russ Cox7ff68b32010-12-13 17:08:27 -0500177<h3>Goroutine destruction</h3>
178
179<p>
180The exit of a goroutine is not guaranteed to happen before
181any event in the program. For example, in this program:
182</p>
183
184<pre>
185var a string
186
187func hello() {
188 go func() { a = "hello" }()
189 print(a)
190}
191</pre>
192
193<p>
194the assignment to <code>a</code> is not followed by
195any synchronization event, so it is not guaranteed to be
196observed by any other goroutine.
197In fact, an aggressive compiler might delete the entire <code>go</code> statement.
198</p>
199
200<p>
201If the effects of a goroutine must be observed by another goroutine,
202use a synchronization mechanism such as a lock or channel
Russ Cox43f459c2010-12-14 11:33:17 -0500203communication to establish a relative ordering.
Russ Cox7ff68b32010-12-13 17:08:27 -0500204</p>
205
Russ Cox82c38cf2009-02-20 15:35:20 -0800206<h3>Channel communication</h3>
207
208<p>
209Channel communication is the main method of synchronization
210between goroutines. Each send on a particular channel
211is matched to a corresponding receive from that channel,
212usually in a different goroutine.
213</p>
214
215<p class="rule">
216A send on a channel happens before the corresponding
217receive from that channel completes.
218</p>
219
220<p>
Rob Pike4e5296d2009-11-01 20:58:33 -0800221This program:
Russ Cox82c38cf2009-02-20 15:35:20 -0800222</p>
223
224<pre>
Rob Pike4e5296d2009-11-01 20:58:33 -0800225var c = make(chan int, 10)
226var a string
Russ Cox82c38cf2009-02-20 15:35:20 -0800227
228func f() {
David Symondscc99ba02010-04-06 11:14:44 +1000229 a = "hello, world"
230 c &lt;- 0
Russ Cox82c38cf2009-02-20 15:35:20 -0800231}
232
233func main() {
David Symondscc99ba02010-04-06 11:14:44 +1000234 go f()
235 &lt;-c
236 print(a)
Russ Cox82c38cf2009-02-20 15:35:20 -0800237}
238</pre>
239
240<p>
241is guaranteed to print <code>"hello, world"</code>. The write to <code>a</code>
242happens before the send on <code>c</code>, which happens before
243the corresponding receive on <code>c</code> completes, which happens before
244the <code>print</code>.
245</p>
246
247<p class="rule">
Russ Cox9f03d4a2011-05-16 17:03:51 -0400248The closing of a channel happens before a receive that returns a zero value
249because the channel is closed.
250</p>
251
252<p>
253In the previous example, replacing
254<code>c &lt;- 0</code> with <code>close(c)</code>
255yields a program with the same guaranteed behavior.
256</p>
257
258<p class="rule">
Russ Cox82c38cf2009-02-20 15:35:20 -0800259A receive from an unbuffered channel happens before
260the send on that channel completes.
261</p>
262
263<p>
Andrew Gerrand2551cf92010-02-22 16:51:28 -0800264This program (as above, but with the send and receive statements swapped and
265using an unbuffered channel):
Russ Cox82c38cf2009-02-20 15:35:20 -0800266</p>
267
268<pre>
Rob Pike4e5296d2009-11-01 20:58:33 -0800269var c = make(chan int)
270var a string
Russ Cox82c38cf2009-02-20 15:35:20 -0800271
272func f() {
David Symondscc99ba02010-04-06 11:14:44 +1000273 a = "hello, world"
274 &lt;-c
Russ Cox82c38cf2009-02-20 15:35:20 -0800275}
276</pre>
277
278<pre>
279func main() {
David Symondscc99ba02010-04-06 11:14:44 +1000280 go f()
281 c &lt;- 0
282 print(a)
Russ Cox82c38cf2009-02-20 15:35:20 -0800283}
284</pre>
285
286<p>
Rob Pike4e5296d2009-11-01 20:58:33 -0800287is also guaranteed to print <code>"hello, world"</code>. The write to <code>a</code>
Russ Cox82c38cf2009-02-20 15:35:20 -0800288happens before the receive on <code>c</code>, which happens before
289the corresponding send on <code>c</code> completes, which happens
290before the <code>print</code>.
291</p>
292
293<p>
294If the channel were buffered (e.g., <code>c = make(chan int, 1)</code>)
295then the program would not be guaranteed to print
David Symondsaecf5032012-09-11 08:47:30 +1000296<code>"hello, world"</code>. (It might print the empty string,
297crash, or do something else.)
Russ Cox82c38cf2009-02-20 15:35:20 -0800298</p>
299
Russ Cox132e8162014-03-24 19:11:21 -0400300<p class="rule">
Dmitriy Vyukov81a93ef2014-06-05 21:08:28 +0400301The <i>k</i>th receive on a channel with capacity <i>C</i> happens before the <i>k</i>+<i>C</i>th send from that channel completes.
Russ Cox132e8162014-03-24 19:11:21 -0400302</p>
303
304<p>
305This rule generalizes the previous rule to buffered channels.
306It allows a counting semaphore to be modeled by a buffered channel:
Dmitriy Vyukov81a93ef2014-06-05 21:08:28 +0400307the number of items in the channel corresponds to the number of active uses,
308the capacity of the channel corresponds to the maximum number of simultaneous uses,
Russ Cox132e8162014-03-24 19:11:21 -0400309sending an item acquires the semaphore, and receiving an item releases
310the semaphore.
Dmitriy Vyukov81a93ef2014-06-05 21:08:28 +0400311This is a common idiom for limiting concurrency.
Russ Cox132e8162014-03-24 19:11:21 -0400312</p>
313
314<p>
315This program starts a goroutine for every entry in the work list, but the
316goroutines coordinate using the <code>limit</code> channel to ensure
317that at most three are running work functions at a time.
318</p>
319
320<pre>
321var limit = make(chan int, 3)
322
323func main() {
324 for _, w := range work {
325 go func() {
326 limit <- 1
327 w()
328 <-limit
329 }()
330 }
331 select{}
332}
333</pre>
334
Russ Cox82c38cf2009-02-20 15:35:20 -0800335<h3>Locks</h3>
336
337<p>
338The <code>sync</code> package implements two lock data types,
339<code>sync.Mutex</code> and <code>sync.RWMutex</code>.
340</p>
341
342<p class="rule">
Russ Cox830813f2009-11-08 21:08:27 -0800343For any <code>sync.Mutex</code> or <code>sync.RWMutex</code> variable <code>l</code> and <i>n</i> &lt; <i>m</i>,
Jeremy Jackins7e054262012-03-19 08:26:36 +1100344call <i>n</i> of <code>l.Unlock()</code> happens before call <i>m</i> of <code>l.Lock()</code> returns.
Russ Cox82c38cf2009-02-20 15:35:20 -0800345</p>
346
347<p>
Rob Pike4e5296d2009-11-01 20:58:33 -0800348This program:
Russ Cox82c38cf2009-02-20 15:35:20 -0800349</p>
350
351<pre>
Rob Pike4e5296d2009-11-01 20:58:33 -0800352var l sync.Mutex
353var a string
Russ Cox82c38cf2009-02-20 15:35:20 -0800354
355func f() {
David Symondscc99ba02010-04-06 11:14:44 +1000356 a = "hello, world"
357 l.Unlock()
Russ Cox82c38cf2009-02-20 15:35:20 -0800358}
359
360func main() {
David Symondscc99ba02010-04-06 11:14:44 +1000361 l.Lock()
362 go f()
363 l.Lock()
364 print(a)
Russ Cox82c38cf2009-02-20 15:35:20 -0800365}
366</pre>
367
368<p>
369is guaranteed to print <code>"hello, world"</code>.
370The first call to <code>l.Unlock()</code> (in <code>f</code>) happens
371before the second call to <code>l.Lock()</code> (in <code>main</code>) returns,
372which happens before the <code>print</code>.
373</p>
374
Russ Cox830813f2009-11-08 21:08:27 -0800375<p class="rule">
376For any call to <code>l.RLock</code> on a <code>sync.RWMutex</code> variable <code>l</code>,
Jeremy Jackins7e054262012-03-19 08:26:36 +1100377there is an <i>n</i> such that the <code>l.RLock</code> happens (returns) after call <i>n</i> to
Russ Cox830813f2009-11-08 21:08:27 -0800378<code>l.Unlock</code> and the matching <code>l.RUnlock</code> happens
Jeremy Jackins7e054262012-03-19 08:26:36 +1100379before call <i>n</i>+1 to <code>l.Lock</code>.
Russ Cox82c38cf2009-02-20 15:35:20 -0800380</p>
381
382<h3>Once</h3>
383
384<p>
Rob Pikeb6ad32b2010-09-20 07:37:41 +1000385The <code>sync</code> package provides a safe mechanism for
386initialization in the presence of multiple goroutines
387through the use of the <code>Once</code> type.
Russ Cox82c38cf2009-02-20 15:35:20 -0800388Multiple threads can execute <code>once.Do(f)</code> for a particular <code>f</code>,
389but only one will run <code>f()</code>, and the other calls block
390until <code>f()</code> has returned.
391</p>
392
Rob Pike4e5296d2009-11-01 20:58:33 -0800393<p class="rule">
394A 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 -0800395</p>
396
397<p>
Rob Pike4e5296d2009-11-01 20:58:33 -0800398In this program:
Russ Cox82c38cf2009-02-20 15:35:20 -0800399</p>
400
401<pre>
Rob Pike4e5296d2009-11-01 20:58:33 -0800402var a string
Rob Pikeb6ad32b2010-09-20 07:37:41 +1000403var once sync.Once
Russ Cox82c38cf2009-02-20 15:35:20 -0800404
405func setup() {
David Symondscc99ba02010-04-06 11:14:44 +1000406 a = "hello, world"
Russ Cox82c38cf2009-02-20 15:35:20 -0800407}
408
409func doprint() {
David Symondscc99ba02010-04-06 11:14:44 +1000410 once.Do(setup)
411 print(a)
Russ Cox82c38cf2009-02-20 15:35:20 -0800412}
413
414func twoprint() {
David Symondscc99ba02010-04-06 11:14:44 +1000415 go doprint()
416 go doprint()
Russ Cox82c38cf2009-02-20 15:35:20 -0800417}
418</pre>
419
420<p>
421calling <code>twoprint</code> causes <code>"hello, world"</code> to be printed twice.
Jan Merclad50f6b2013-08-23 10:40:01 -0500422The first call to <code>doprint</code> runs <code>setup</code> once.
Russ Cox82c38cf2009-02-20 15:35:20 -0800423</p>
424
425<h2>Incorrect synchronization</h2>
426
427<p>
428Note that a read <span class="event">r</span> may observe the value written by a write <span class="event">w</span>
429that happens concurrently with <span class="event">r</span>.
430Even if this occurs, it does not imply that reads happening after <span class="event">r</span>
431will observe writes that happened before <span class="event">w</span>.
432</p>
433
434<p>
Rob Pike4e5296d2009-11-01 20:58:33 -0800435In this program:
Russ Cox82c38cf2009-02-20 15:35:20 -0800436</p>
437
438<pre>
Rob Pike4e5296d2009-11-01 20:58:33 -0800439var a, b int
Russ Cox82c38cf2009-02-20 15:35:20 -0800440
441func f() {
David Symondscc99ba02010-04-06 11:14:44 +1000442 a = 1
443 b = 2
Russ Cox82c38cf2009-02-20 15:35:20 -0800444}
445
446func g() {
David Symondscc99ba02010-04-06 11:14:44 +1000447 print(b)
448 print(a)
Russ Cox82c38cf2009-02-20 15:35:20 -0800449}
450
451func main() {
David Symondscc99ba02010-04-06 11:14:44 +1000452 go f()
453 g()
Russ Cox82c38cf2009-02-20 15:35:20 -0800454}
455</pre>
456
457<p>
458it can happen that <code>g</code> prints <code>2</code> and then <code>0</code>.
459</p>
460
461<p>
Rob Pike4e5296d2009-11-01 20:58:33 -0800462This fact invalidates a few common idioms.
Russ Cox82c38cf2009-02-20 15:35:20 -0800463</p>
464
465<p>
466Double-checked locking is an attempt to avoid the overhead of synchronization.
Rob Pike4e5296d2009-11-01 20:58:33 -0800467For example, the <code>twoprint</code> program might be
Russ Cox82c38cf2009-02-20 15:35:20 -0800468incorrectly written as:
469</p>
470
471<pre>
Rob Pike4e5296d2009-11-01 20:58:33 -0800472var a string
473var done bool
Russ Cox82c38cf2009-02-20 15:35:20 -0800474
475func setup() {
David Symondscc99ba02010-04-06 11:14:44 +1000476 a = "hello, world"
477 done = true
Russ Cox82c38cf2009-02-20 15:35:20 -0800478}
479
480func doprint() {
481 if !done {
David Symondscc99ba02010-04-06 11:14:44 +1000482 once.Do(setup)
Russ Cox82c38cf2009-02-20 15:35:20 -0800483 }
David Symondscc99ba02010-04-06 11:14:44 +1000484 print(a)
Russ Cox82c38cf2009-02-20 15:35:20 -0800485}
486
487func twoprint() {
David Symondscc99ba02010-04-06 11:14:44 +1000488 go doprint()
489 go doprint()
Russ Cox82c38cf2009-02-20 15:35:20 -0800490}
491</pre>
492
493<p>
494but there is no guarantee that, in <code>doprint</code>, observing the write to <code>done</code>
495implies observing the write to <code>a</code>. This
496version can (incorrectly) print an empty string
497instead of <code>"hello, world"</code>.
498</p>
499
500<p>
501Another incorrect idiom is busy waiting for a value, as in:
502</p>
503
504<pre>
Rob Pike4e5296d2009-11-01 20:58:33 -0800505var a string
506var done bool
Russ Cox82c38cf2009-02-20 15:35:20 -0800507
508func setup() {
David Symondscc99ba02010-04-06 11:14:44 +1000509 a = "hello, world"
510 done = true
Russ Cox82c38cf2009-02-20 15:35:20 -0800511}
512
513func main() {
David Symondscc99ba02010-04-06 11:14:44 +1000514 go setup()
Russ Cox82c38cf2009-02-20 15:35:20 -0800515 for !done {
516 }
David Symondscc99ba02010-04-06 11:14:44 +1000517 print(a)
Russ Cox82c38cf2009-02-20 15:35:20 -0800518}
519</pre>
520
521<p>
522As before, there is no guarantee that, in <code>main</code>,
Rob Pike4e5296d2009-11-01 20:58:33 -0800523observing the write to <code>done</code>
Russ Cox82c38cf2009-02-20 15:35:20 -0800524implies observing the write to <code>a</code>, so this program could
525print an empty string too.
526Worse, there is no guarantee that the write to <code>done</code> will ever
527be observed by <code>main</code>, since there are no synchronization
528events between the two threads. The loop in <code>main</code> is not
529guaranteed to finish.
530</p>
531
532<p>
Rob Pike4e5296d2009-11-01 20:58:33 -0800533There are subtler variants on this theme, such as this program.
Russ Cox82c38cf2009-02-20 15:35:20 -0800534</p>
535
536<pre>
537type T struct {
David Symondscc99ba02010-04-06 11:14:44 +1000538 msg string
Russ Cox82c38cf2009-02-20 15:35:20 -0800539}
540
Rob Pike4e5296d2009-11-01 20:58:33 -0800541var g *T
Russ Cox82c38cf2009-02-20 15:35:20 -0800542
543func setup() {
David Symondscc99ba02010-04-06 11:14:44 +1000544 t := new(T)
545 t.msg = "hello, world"
546 g = t
Russ Cox82c38cf2009-02-20 15:35:20 -0800547}
548
549func main() {
David Symondscc99ba02010-04-06 11:14:44 +1000550 go setup()
Russ Cox82c38cf2009-02-20 15:35:20 -0800551 for g == nil {
552 }
David Symondscc99ba02010-04-06 11:14:44 +1000553 print(g.msg)
Russ Cox82c38cf2009-02-20 15:35:20 -0800554}
555</pre>
556
557<p>
558Even if <code>main</code> observes <code>g != nil</code> and exits its loop,
559there is no guarantee that it will observe the initialized
560value for <code>g.msg</code>.
561</p>
562
563<p>
564In all these examples, the solution is the same:
565use explicit synchronization.
566</p>