篳路藍縷,以啟山林。撫有蠻夷,以屬華夏。不鳴則已,一鳴驚人。
——《左傳`宣公十二年》
今兒看到了乙個題目,電腦開著順手實現下。方便起見,下文以a、b、c字母來標識三個goroutine。這個題目方式還是很多的,**變換多樣。上**:
姿勢1:chan通知與切換
一句話來描述思路:a對b說:我搞完了,輪到你了,b對c說:我搞完了,輪到你了,c對a說:我搞完了,輪到你了......子子孫孫無窮匱也、
func main()
} }()
go func()
} }()
go func()
select
} }()
for !false
}控制台:
[a]: 1
[b]: 2
[c]: 3
[a]: 4
[b]: 5
[c]: 6
[a]: 7
[b]: 8
[c]: 9
[a]: 10
[b]: 11
[c]: 12
[a]: 13
[b]: 14
[c]: 15
[a]: 16
[b]: 17
[c]: 18
[a]: 19
[b]: 20
[c]: 21
[a]: 22
[b]: 23
[c]: 24
......
...
姿勢2:換一下角色,列印操作交給main線,寫入由a、b、c各自完成
type data struct
func main()
cha <- data0
i += 3
} }()
go func()
chb <- data0
i += 3
} }()
go func()
chc <- data0
i += 3
} }()
flag := false
for !flag
}控制台:
[a]: 1
[b]: 2
[c]: 3
[a]: 4
[b]: 5
[c]: 6
[a]: 7
[b]: 8
[c]: 9
[a]: 10
[b]: 11
[c]: 12
[a]: 13
[b]: 14
[c]: 15
[a]: 16
[b]: 17
[c]: 18
[a]: 19
[b]: 20
[c]: 21
[a]: 22
[b]: 23
[c]: 24
......
...
姿勢3:就以列印結果來衡量的話,sleep也能用上
type obj struct
func main()
} }()
go func()
} }()
go func()
} }()
for i := 1; ; i++
if (i-1)%3 == 0
if (i-2)%3 == 0
if (i-3)%3 == 0 }}
控制台:
[a]: 1
[b]: 2
[c]: 3
[a]: 4
[b]: 5
[c]: 6
[a]: 7
[b]: 8
[c]: 9
[a]: 10
[b]: 11
[c]: 12
[a]: 13
[b]: 14
[c]: 15
[a]: 16
[b]: 17
[c]: 18
[a]: 19
[b]: 20
[c]: 21
[a]: 22
[b]: 23
[c]: 24
......
...
go併發之美·乾貨好文合集:
go併發之美·redis篇·介面冪等性設計實現
go併發之美·redis篇·實現實時排行榜
go併發日記·多goroutine併發安全的操作共享變數
go併發日記·常用併發場景中的併發控制思路與方案
go併發日記·避免goroutine洩漏/實現協程可控
go併發日記·深入理解go語言channel與goroutine阻塞
go併發日記·基於channel優雅的進行併發控制
go併發日記·waitgroup併發控制探索及實際場景運用
channel死鎖的情況分析
go併發之美·b操作伴隨a操作(b和a同步)
go多函式併發通用工具的設計與實現
java兩個執行緒交替執行
一般來說執行緒鎖可以用 synchronized lock。這個題目的難點不在於同步塊,而在於怎麼樣設計這個兩個執行緒的交替實現。由於執行緒爭用cpu的隨機性,就需要a線,b執行緒執行,在b執行完一次進入等待之前喚醒a,如此往復,那麼這裡就要用上notify和wait了。author wangh.w...
實現兩個執行緒交替執行
比如執行緒1輸出0,執行緒2輸出0,執行緒1輸出1,執行緒2輸出1。既然有先後順序,優先想到和順序有關的鎖,reentrantlock的公平鎖,等待時間最長的執行緒優先獲取鎖。如下 public class alternatedemo static class task implements run...
3執行緒交替列印ABC,列印n次
今天看到乙個多執行緒的面試題,初看起來很簡單,實際寫起來還是有需要注意的地方,寫了兩個解法,記錄下 都比較簡單,不解釋。private inte ce callback private static class abctestconditionrunnable implements runnable...