最近遇到了一個和多線程有關的事,順便簡單複習了下相關概念,稍後舉個栗子🌰來解釋下。安全
進程咱們都知道,就是應用程序的啓動實例。好比咱們運行一個遊戲,打開一個軟件,就是開啓了一個進程。微信
而線程從屬於進程,是程序的實際執行者。一個進程至少包含一個主線程,也能夠有更多的子線程。多線程
咱們能夠簡單的理解:爲了作一件事,我開了一個進程,爲了讓這件事更有效率的完成,我開了多個線程。工具
若是這麼說仍是不清楚的話,咱們以一個找對象的例子來加深理解:學習
讀研了,望着身邊的小夥伴一個個都是成雙成對,筆者有一個萬年單身的好基友就跟一條酸菜魚似的(又酸又菜又多餘),想着要不也找個女友吧?因而就建立了一個名爲**「找對象」的進程**。可是學校女生太多了,若是一個一個試的話不知道啥時候才能脫單。這時候,萬能的度娘給出了建議,爲何不一樣時下手呢?線程
因而,他就建立了兩個「撩妹」的線程,每一個線程負責撩一個妹子。但這時就有問題出來了。cdn
雖然他能夠同時撩兩個妹子,可是有些事情就是沒辦法同時和兩個妹子作,好比上課、吃飯、散步。這個時候就須要**「數據保護」。作這些事情的時候,他一次只能跟一個妹子作,這就叫作「臨界區」。他撩的兩個妹子,一個是紅玫瑰,一個是白玫瑰,各有各的特色,這是她們的「私有屬性」。這兩個妹子均可以跟他約會,此時他就是一個「共享內存」。若是某一天他跟其中一個妹子在外面約會,那另外一個撩妹線程就只能「阻塞」了。可是爲了防止後院起火,不讓另外一個妹子不爽,他就只能發條朋友圈說本身在學習,不想被打擾,這就叫「互斥鎖」。同時爲了避免讓她們影響對方的存在,他用QQ叫着其中一個的小名,微信倒是另外一個的情侶頭像,這就是「消息傳遞」**。對象
上述兩個線程在某種意義上就構成了**「競態條件」(我的認爲叫作「競爭狀態」會更好)。若是他只有這兩個線程的話,想要完成「找對象」這個進程,就只能看這兩個線程誰的執行效率更高(其實就是看誰先運行完)**了。這麼一看,個人好基友貌似很快就能夠完成「找對象」這一進程了,由於不管是哪一個線程,只要有一個「撩妹」線程結束了,整個進程也就結束了。blog
可是在結束前可能會出現一些問題(注意這裏是可能),若是他在排約會檔期時一旦沒有進行良好的調度,就頗有可能會出現兩個妹子約在同一天約會,基友卻沒辦法到達的狀況,這種狀況就叫「死鎖」,即較長時間的等待或資源競爭。亦或是若是不幸被兩個妹子都發覺了對方的存在,卻又爲表大度,你讓我我讓你,最終致使「找對象」進程沒法進行下去,這就叫作「活鎖」。 若是此時出現了一個*「工具人」妹子,主動倒追我基友,這樣的話即便被加入了「找對象」的進程,也可能會由於一系列問題始終無法和他單獨約會(畢竟還有兩個「撩妹」線程在進行着),這種狀況就叫作「飢餓」*。 這三種狀況總結一下就是:遊戲
假若我基友最後撩成功的女友並非他最喜歡的那我的,即最終的運行結果和預期不一樣,這就叫**「線程不安全」。反之,若是最後撩成功的妹子是他最喜歡的,即最終的結果和預期相同,那這個就叫「線程安全」**。
這麼一看,真是人生如戲。只是可悲的是,我本覺得如今執行的是一個單進程,卻沒想到也只是別人的一個線程罷了。
若是你以爲個人文章還不錯,不妨掃描下方二維碼關注我,你的支持是我前進的最大動力💪