Я изучаю проблемы параллелизма на Голанге.Я написал некоторый код:
package main
import (
"fmt"
"time"
)
func incr(num *int) {
*num = *num + 1
}
func main() {
var a = 0
for i := 0; i < 50; i++ {
go incr(&a)
}
incr(&a)
time.Sleep(1 * time.Second)
fmt.Println(a)
}
Результат этого кода: 51
В этом коде я объявил переменную a
, которую я увеличиваю в 50 запущенных программах.То, что я прочитал и не понял, этот код должен потерпеть неудачу, потому что несколько goroutines пишут по одному адресу памяти.В этом случае я должен добавить sync.Mutex
блокировку, чтобы исправить это.
Код доступен на детской площадке: https://play.golang.org/p/Tba9pfpxaHY
Не могли бы вы объяснить, что на самом деле происходит в этой программе?