Incorrect Synchronization in Go Lang
The Go memory model specifies that in a single goroutine, reads and writes must behave as if they executed in the order specified by the program. However, a peculiar behavior occurs when using multiple goroutines, as exemplified by the following code:
var a, b int func f() { a = 1 b = 2 } func g() { print(b) print(a) } func main() { go f() g() }
According to the document, it's possible for the code to print "2" first and then "0" instead of the expected "1" and "2." Why does this happen?
Despite appearing sequential in the code, assignments to a and b can occur out of order within the f goroutine. Since the goroutine does not use the variables after assignment, the compiler can optimize by reordering them.
However, the lack of synchronization between the f and g goroutines means the compiler does not ensure consistency at the time of printing. As a result, b's value can be observed before a's when both assignments occur in the same goroutine.
To ensure correctness, synchronization between goroutines is required. At the synchronization point, the compiler will guarantee that both assignments have completed. For example, if a synchronization point is placed before the print calls, the new values (2 and 1) will be printed correctly, preventing the incorrect behavior.
The above is the detailed content of Why Does Go\'s Memory Model Allow Unexpected Output in Concurrent Goroutines?. For more information, please follow other related articles on the PHP Chinese website!