Is synchronization required?

Issue

I defined a variable (r.something) inside an object

func (r *Runner) init() {
  r.something = make(map[string]int)
  r.something["a"]=1

  go r.goroutine()
}

while r.goroutine uses value stored in r.something with no synchronization.
Nobody else is going to read/write this value except r.goroutine()

Is it safe to do without synchronization?

In other words: I want to reuse some variable from a goroutine initialized somewhere else before goroutine start. Is that safe?

Additional question:
After r.goroutine() finishes I want to be able to use r.something from somewhere else(without read/write overlap with other goroutines). Is it safe too?

Solution

Of course this is safe, otherwise programming in Go might be a nightmare (or at least much less pleasant). The Go Memory Model is an interesting piece to read.

The routine creation is a synchronisation point. There is an example very similar to yours:

var a string

func f() {
    print(a)
}

func hello() {
    a = "hello, world"
    go f()
}

With the following comment:

calling hello will print “hello, world” at some point in the future (perhaps after hello has returned).

This is because:

The go statement that starts a new goroutine happens before the goroutine’s execution begins.

The word before is crucial here as it implies routine creation (in one thread) must be synchronised with its start (possibly in other thread), so writes to a must be visible by the new routine.

Answered By – tomasz

Answer Checked By – Dawn Plyler (GoLangFix Volunteer)

Leave a Reply

Your email address will not be published.