在公平锁解法的代码中,程序可以保证上锁和解锁顺序是一致的,但无法保证三个 Goroutine 的启动顺序。
假设三个线程的启动顺序是 C,B,A
那么它们的上锁顺序就是 C,B,A,C,B,A,C,B,A,C,B,A...,为了方便描述,我给它们标上上了序号
上锁线程 | C | B | A | C | B | A | C | B | A | C | B | A |
---|---|---|---|---|---|---|---|---|---|---|---|---|
上锁编号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
在符合 i < 3
的条件下,上锁编号为0,1,3,5
的操作都会直接continue
,不会输出任何值。当i>=3
之后,所有操作都会直接将值输出,所以可以看到后面就会按着B,A,C
的顺序来输出了。