github.com/likebike/go--@v0.0.0-20190911215757-0bd925d16e96/go/doc/go_mem.html (about) 1 <!--{ 2 "Title": "The Go Memory Model", 3 "Subtitle": "Version of May 31, 2014", 4 "Path": "/ref/mem" 5 }--> 6 7 <style> 8 p.rule { 9 font-style: italic; 10 } 11 span.event { 12 font-style: italic; 13 } 14 </style> 15 16 <h2>Introduction</h2> 17 18 <p> 19 The Go memory model specifies the conditions under which 20 reads of a variable in one goroutine can be guaranteed to 21 observe values produced by writes to the same variable in a different goroutine. 22 </p> 23 24 25 <h2>Advice</h2> 26 27 <p> 28 Programs that modify data being simultaneously accessed by multiple goroutines 29 must serialize such access. 30 </p> 31 32 <p> 33 To serialize access, protect the data with channel operations or other synchronization primitives 34 such as those in the <a href="/pkg/sync/"><code>sync</code></a> 35 and <a href="/pkg/sync/atomic/"><code>sync/atomic</code></a> packages. 36 </p> 37 38 <p> 39 If you must read the rest of this document to understand the behavior of your program, 40 you are being too clever. 41 </p> 42 43 <p> 44 Don't be clever. 45 </p> 46 47 <h2>Happens Before</h2> 48 49 <p> 50 Within a single goroutine, reads and writes must behave 51 as if they executed in the order specified by the program. 52 That is, compilers and processors may reorder the reads and writes 53 executed within a single goroutine only when the reordering 54 does not change the behavior within that goroutine 55 as defined by the language specification. 56 Because of this reordering, the execution order observed 57 by one goroutine may differ from the order perceived 58 by another. For example, if one goroutine 59 executes <code>a = 1; b = 2;</code>, another might observe 60 the updated value of <code>b</code> before the updated value of <code>a</code>. 61 </p> 62 63 <p> 64 To specify the requirements of reads and writes, we define 65 <i>happens before</i>, a partial order on the execution 66 of memory operations in a Go program. If event <span class="event">e<sub>1</sub></span> happens 67 before 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>. 68 Also, 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 69 after <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 72 <p class="rule"> 73 Within a single goroutine, the happens-before order is the 74 order expressed by the program. 75 </p> 76 77 <p> 78 A 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> 79 if both of the following hold: 80 </p> 81 82 <ol> 83 <li><span class="event">r</span> does not happen before <span class="event">w</span>.</li> 84 <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> 89 To guarantee that a read <span class="event">r</span> of a variable <code>v</code> observes a 90 particular write <span class="event">w</span> to <code>v</code>, ensure that <span class="event">w</span> is the only 91 write <span class="event">r</span> is allowed to observe. 92 That 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> 98 either happens before <span class="event">w</span> or after <span class="event">r</span>.</li> 99 </ol> 100 101 <p> 102 This pair of conditions is stronger than the first pair; 103 it requires that there are no other writes happening 104 concurrently with <span class="event">w</span> or <span class="event">r</span>. 105 </p> 106 107 <p> 108 Within a single goroutine, 109 there is no concurrency, so the two definitions are equivalent: 110 a read <span class="event">r</span> observes the value written by the most recent write <span class="event">w</span> to <code>v</code>. 111 When multiple goroutines access a shared variable <code>v</code>, 112 they must use synchronization events to establish 113 happens-before conditions that ensure reads observe the 114 desired writes. 115 </p> 116 117 <p> 118 The initialization of variable <code>v</code> with the zero value 119 for <code>v</code>'s type behaves as a write in the memory model. 120 </p> 121 122 <p> 123 Reads and writes of values larger than a single machine word 124 behave as multiple machine-word-sized operations in an 125 unspecified order. 126 </p> 127 128 <h2>Synchronization</h2> 129 130 <h3>Initialization</h3> 131 132 <p> 133 Program initialization runs in a single goroutine, 134 but that goroutine may create other goroutines, 135 which run concurrently. 136 </p> 137 138 <p class="rule"> 139 If 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"> 144 The start of the function <code>main.main</code> happens after 145 all <code>init</code> functions have finished. 146 </p> 147 148 <h3>Goroutine creation</h3> 149 150 <p class="rule"> 151 The <code>go</code> statement that starts a new goroutine 152 happens before the goroutine's execution begins. 153 </p> 154 155 <p> 156 For example, in this program: 157 </p> 158 159 <pre> 160 var a string 161 162 func f() { 163 print(a) 164 } 165 166 func hello() { 167 a = "hello, world" 168 go f() 169 } 170 </pre> 171 172 <p> 173 calling <code>hello</code> will print <code>"hello, world"</code> 174 at some point in the future (perhaps after <code>hello</code> has returned). 175 </p> 176 177 <h3>Goroutine destruction</h3> 178 179 <p> 180 The exit of a goroutine is not guaranteed to happen before 181 any event in the program. For example, in this program: 182 </p> 183 184 <pre> 185 var a string 186 187 func hello() { 188 go func() { a = "hello" }() 189 print(a) 190 } 191 </pre> 192 193 <p> 194 the assignment to <code>a</code> is not followed by 195 any synchronization event, so it is not guaranteed to be 196 observed by any other goroutine. 197 In fact, an aggressive compiler might delete the entire <code>go</code> statement. 198 </p> 199 200 <p> 201 If the effects of a goroutine must be observed by another goroutine, 202 use a synchronization mechanism such as a lock or channel 203 communication to establish a relative ordering. 204 </p> 205 206 <h3>Channel communication</h3> 207 208 <p> 209 Channel communication is the main method of synchronization 210 between goroutines. Each send on a particular channel 211 is matched to a corresponding receive from that channel, 212 usually in a different goroutine. 213 </p> 214 215 <p class="rule"> 216 A send on a channel happens before the corresponding 217 receive from that channel completes. 218 </p> 219 220 <p> 221 This program: 222 </p> 223 224 <pre> 225 var c = make(chan int, 10) 226 var a string 227 228 func f() { 229 a = "hello, world" 230 c <- 0 231 } 232 233 func main() { 234 go f() 235 <-c 236 print(a) 237 } 238 </pre> 239 240 <p> 241 is guaranteed to print <code>"hello, world"</code>. The write to <code>a</code> 242 happens before the send on <code>c</code>, which happens before 243 the corresponding receive on <code>c</code> completes, which happens before 244 the <code>print</code>. 245 </p> 246 247 <p class="rule"> 248 The closing of a channel happens before a receive that returns a zero value 249 because the channel is closed. 250 </p> 251 252 <p> 253 In the previous example, replacing 254 <code>c <- 0</code> with <code>close(c)</code> 255 yields a program with the same guaranteed behavior. 256 </p> 257 258 <p class="rule"> 259 A receive from an unbuffered channel happens before 260 the send on that channel completes. 261 </p> 262 263 <p> 264 This program (as above, but with the send and receive statements swapped and 265 using an unbuffered channel): 266 </p> 267 268 <pre> 269 var c = make(chan int) 270 var a string 271 272 func f() { 273 a = "hello, world" 274 <-c 275 } 276 </pre> 277 278 <pre> 279 func main() { 280 go f() 281 c <- 0 282 print(a) 283 } 284 </pre> 285 286 <p> 287 is also guaranteed to print <code>"hello, world"</code>. The write to <code>a</code> 288 happens before the receive on <code>c</code>, which happens before 289 the corresponding send on <code>c</code> completes, which happens 290 before the <code>print</code>. 291 </p> 292 293 <p> 294 If the channel were buffered (e.g., <code>c = make(chan int, 1)</code>) 295 then the program would not be guaranteed to print 296 <code>"hello, world"</code>. (It might print the empty string, 297 crash, or do something else.) 298 </p> 299 300 <p class="rule"> 301 The <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. 302 </p> 303 304 <p> 305 This rule generalizes the previous rule to buffered channels. 306 It allows a counting semaphore to be modeled by a buffered channel: 307 the number of items in the channel corresponds to the number of active uses, 308 the capacity of the channel corresponds to the maximum number of simultaneous uses, 309 sending an item acquires the semaphore, and receiving an item releases 310 the semaphore. 311 This is a common idiom for limiting concurrency. 312 </p> 313 314 <p> 315 This program starts a goroutine for every entry in the work list, but the 316 goroutines coordinate using the <code>limit</code> channel to ensure 317 that at most three are running work functions at a time. 318 </p> 319 320 <pre> 321 var limit = make(chan int, 3) 322 323 func main() { 324 for _, w := range work { 325 go func(w func()) { 326 limit <- 1 327 w() 328 <-limit 329 }(w) 330 } 331 select{} 332 } 333 </pre> 334 335 <h3>Locks</h3> 336 337 <p> 338 The <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"> 343 For any <code>sync.Mutex</code> or <code>sync.RWMutex</code> variable <code>l</code> and <i>n</i> < <i>m</i>, 344 call <i>n</i> of <code>l.Unlock()</code> happens before call <i>m</i> of <code>l.Lock()</code> returns. 345 </p> 346 347 <p> 348 This program: 349 </p> 350 351 <pre> 352 var l sync.Mutex 353 var a string 354 355 func f() { 356 a = "hello, world" 357 l.Unlock() 358 } 359 360 func main() { 361 l.Lock() 362 go f() 363 l.Lock() 364 print(a) 365 } 366 </pre> 367 368 <p> 369 is guaranteed to print <code>"hello, world"</code>. 370 The first call to <code>l.Unlock()</code> (in <code>f</code>) happens 371 before the second call to <code>l.Lock()</code> (in <code>main</code>) returns, 372 which happens before the <code>print</code>. 373 </p> 374 375 <p class="rule"> 376 For any call to <code>l.RLock</code> on a <code>sync.RWMutex</code> variable <code>l</code>, 377 there is an <i>n</i> such that the <code>l.RLock</code> happens (returns) after call <i>n</i> to 378 <code>l.Unlock</code> and the matching <code>l.RUnlock</code> happens 379 before call <i>n</i>+1 to <code>l.Lock</code>. 380 </p> 381 382 <h3>Once</h3> 383 384 <p> 385 The <code>sync</code> package provides a safe mechanism for 386 initialization in the presence of multiple goroutines 387 through the use of the <code>Once</code> type. 388 Multiple threads can execute <code>once.Do(f)</code> for a particular <code>f</code>, 389 but only one will run <code>f()</code>, and the other calls block 390 until <code>f()</code> has returned. 391 </p> 392 393 <p class="rule"> 394 A single call of <code>f()</code> from <code>once.Do(f)</code> happens (returns) before any call of <code>once.Do(f)</code> returns. 395 </p> 396 397 <p> 398 In this program: 399 </p> 400 401 <pre> 402 var a string 403 var once sync.Once 404 405 func setup() { 406 a = "hello, world" 407 } 408 409 func doprint() { 410 once.Do(setup) 411 print(a) 412 } 413 414 func twoprint() { 415 go doprint() 416 go doprint() 417 } 418 </pre> 419 420 <p> 421 calling <code>twoprint</code> causes <code>"hello, world"</code> to be printed twice. 422 The first call to <code>doprint</code> runs <code>setup</code> once. 423 </p> 424 425 <h2>Incorrect synchronization</h2> 426 427 <p> 428 Note that a read <span class="event">r</span> may observe the value written by a write <span class="event">w</span> 429 that happens concurrently with <span class="event">r</span>. 430 Even if this occurs, it does not imply that reads happening after <span class="event">r</span> 431 will observe writes that happened before <span class="event">w</span>. 432 </p> 433 434 <p> 435 In this program: 436 </p> 437 438 <pre> 439 var a, b int 440 441 func f() { 442 a = 1 443 b = 2 444 } 445 446 func g() { 447 print(b) 448 print(a) 449 } 450 451 func main() { 452 go f() 453 g() 454 } 455 </pre> 456 457 <p> 458 it can happen that <code>g</code> prints <code>2</code> and then <code>0</code>. 459 </p> 460 461 <p> 462 This fact invalidates a few common idioms. 463 </p> 464 465 <p> 466 Double-checked locking is an attempt to avoid the overhead of synchronization. 467 For example, the <code>twoprint</code> program might be 468 incorrectly written as: 469 </p> 470 471 <pre> 472 var a string 473 var done bool 474 475 func setup() { 476 a = "hello, world" 477 done = true 478 } 479 480 func doprint() { 481 if !done { 482 once.Do(setup) 483 } 484 print(a) 485 } 486 487 func twoprint() { 488 go doprint() 489 go doprint() 490 } 491 </pre> 492 493 <p> 494 but there is no guarantee that, in <code>doprint</code>, observing the write to <code>done</code> 495 implies observing the write to <code>a</code>. This 496 version can (incorrectly) print an empty string 497 instead of <code>"hello, world"</code>. 498 </p> 499 500 <p> 501 Another incorrect idiom is busy waiting for a value, as in: 502 </p> 503 504 <pre> 505 var a string 506 var done bool 507 508 func setup() { 509 a = "hello, world" 510 done = true 511 } 512 513 func main() { 514 go setup() 515 for !done { 516 } 517 print(a) 518 } 519 </pre> 520 521 <p> 522 As before, there is no guarantee that, in <code>main</code>, 523 observing the write to <code>done</code> 524 implies observing the write to <code>a</code>, so this program could 525 print an empty string too. 526 Worse, there is no guarantee that the write to <code>done</code> will ever 527 be observed by <code>main</code>, since there are no synchronization 528 events between the two threads. The loop in <code>main</code> is not 529 guaranteed to finish. 530 </p> 531 532 <p> 533 There are subtler variants on this theme, such as this program. 534 </p> 535 536 <pre> 537 type T struct { 538 msg string 539 } 540 541 var g *T 542 543 func setup() { 544 t := new(T) 545 t.msg = "hello, world" 546 g = t 547 } 548 549 func main() { 550 go setup() 551 for g == nil { 552 } 553 print(g.msg) 554 } 555 </pre> 556 557 <p> 558 Even if <code>main</code> observes <code>g != nil</code> and exits its loop, 559 there is no guarantee that it will observe the initialized 560 value for <code>g.msg</code>. 561 </p> 562 563 <p> 564 In all these examples, the solution is the same: 565 use explicit synchronization. 566 </p>