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 &lt;- 0
   231  }
   232  
   233  func main() {
   234  	go f()
   235  	&lt;-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 &lt;- 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  	&lt;-c
   275  }
   276  </pre>
   277  
   278  <pre>
   279  func main() {
   280  	go f()
   281  	c &lt;- 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 &lt;- 1
   327  			w()
   328  			&lt;-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> &lt; <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>