我有這樣的簡單的一段代碼(或此處https://play.golang.org/p/KW8_OHUp9v)互斥導致意想不到輸出
package main
import (
"fmt"
"sync"
)
func main() {
mutex := new(sync.Mutex)
for i := 1; i < 5; i++ {
for j := 1; j < 5; j++ {
mutex.Lock()
go func() {
fmt.Printf("%d + %d = %d\n", i, j, j+i)
mutex.Unlock()
}()
}
}
}
它產生這樣
1 + 2 = 3
1 + 3 = 4
1 + 4 = 5
2 + 5 = 7
2 + 2 = 4
2 + 3 = 5
2 + 4 = 6
3 + 5 = 8
3 + 2 = 5
3 + 3 = 6
3 + 4 = 7
4 + 5 = 9
4 + 2 = 6
4 + 3 = 7
4 + 4 = 8
Program exited.
輸出尋找在輸出我很驚訝幾件事:
- 沒有'1的
j
- 有「5的用於
j
- 只有3個值,對於i = 1,代替4-
我可以理解缺乏」 1',因爲它被寫入之前的變量被遞增。
有人可以解釋2.和3.?
請注意,您錯過了最後的'4 + 4',因爲您並未等待最後的goroutine完成。 https://play.golang.org/p/lPQWfvAV5S – JimB
我知道,傳遞'i'和'j'作爲函數參數會有幫助。我錯過了'for'循環的基礎知識,即。該變量首先遞增,然後檢查THEN條件。這解釋了5s –