Java 多執行緒系列文章第 2 篇
接下來幾篇會給大家屢清楚多執行緒中涉及到的一些概念,理解了這些概念,往後的文章才好明白。
今天給大家講講同步和非同步這兄弟倆。
同步 & 非同步
通過我們們現實中的一個場景來描述這 2 個乾巴巴的詞。大家身邊不知道有木有朋友是潮汕的?潮汕地區每家每戶都有功夫茶,只要來客人,一定會用功夫茶來招待。功夫茶關鍵在於功夫兩字,功夫指的是泡茶方式比較講究,它不像我們上班時用保溫瓶泡茶,而是有一道泡茶的流程和工具。下面在網上找到的功夫茶口訣(作為潮汕人這麼久,都不知道有這口訣,是聽我女朋友說有這個口訣才知道。。。)
潮汕功夫茶沖泡口訣:
- 白鶴沐浴(洗杯):用開水洗淨茶杯並提高茶具溫度。
- 觀音入宮(落茶):把鐵觀音茶放入茶具,放茶量約佔茶具容量的五分。
- 懸壺高衝(沖茶):把滾開的水提高衝入茶壺或蓋甌,使茶葉轉動。
- 春風拂面(刮泡沫):用壺蓋或甌蓋輕輕颳去漂浮的白泡沫,使其清新潔淨。
- 關公巡城(倒茶):把泡一、二分鐘後的茶水依次巡迴注入並列的茶杯裡。
- 韓信點兵(點茶):茶水倒到少許時要一點一點均勻地滴到各杯中,使其濃淡均勻。
- 鑑嘗湯色(看茶):觀賞杯中茶水的顏色,聞茶之香氣。
- 品啜甘霖(喝茶):乘熱細綴,先嗅其香,後嘗其味,邊啜邊嗅,淺斟細飲。飲量雖不多,但能齒頰留香,喉底回甘,心曠神怡,別有情趣。
有客人來的時候,我們會先煮水,沒等到水煮沸就先洗茶杯,落茶,等到水煮沸了,再衝茶,倒茶。這個過程中,有些步驟是同步的,比如洗茶杯和落茶,肯定要把茶杯先洗乾淨後再落茶,一個人沒法同時幹這 2 件事,我們關注點放在煮水這個過程,是先煮水,煮水需要比較長的時間,煮水的過程中把茶杯洗了,還有落茶,這個過程其實就是非同步,非同步指沒有乾等待水煮沸,在煮水的過程做其他事情(洗茶杯、落茶),這就像是傳送了一個訊息,通知說要煮水,然後就繼續自己該幹嘛幹嘛,非同步的過程完全不影響當前做的其他事。下圖反映了煮水步驟是非同步的這個過程。
如果主人用下面方式來泡茶,不是新手就是不歡迎你(開玩笑,有可能是主人一見如故,想趁著煮水和你嘮家常)。上面講了非同步泡茶的方式,下面講同步泡茶是啥回事。看下圖,把煮水這個過程放在了時間線下方,也就是在煮水的時候乾等著水煮沸,不做其他的事情,這就是同步,很明顯,最後整個泡茶的過程耗時比非同步的長。
總結
這裡在簡單總結一下(如有錯誤請大家幫忙糾正):
同步(Synchronous):特指在同一個執行緒裡面執行的內容之間的關係是有順序的;執行緒之間需要同步時,就需要使用一些顯式的同步方式,這也是多執行緒帶來的大問題,在多執行緒程式設計需要特別關注。
非同步(Asynchronous):特指一些執行內容可以不用直接等待執行結果,非同步執行的內容一般是在另一個執行緒執行,只需要執行完結果反饋回來就行。
推薦閱讀
公眾號後臺回覆『設計模式』可以獲取《一故事一設計模式》電子書
覺得文章有用幫忙轉發&點贊,多謝朋友們!