多線程,單線程,線程安全,同步,異步的區別

本文是總結知乎上面的知識點,雖然忘記了具體的連接地址,可是仍是很是感謝知乎裏面各位大神的分享!java

 

java 中使用 synchronized 是用來 表示該資源或者該方法是不能進行多個線程的共享的,因此當多個線程都在請求該資源的時候,就跟串行是同樣的也就是單線程效果同樣,可是當不爲共享的時候就能夠利用併發來大大的提升系統的效率。一、多線程並不解決軟件執行效率和你硬件系統的瓶頸,它只是達到更高效使用你的硬件系統資源。二、從本質上來講,單核單CPU不存在並行,即便多線程也是串行,多線程不會提升CPU利用率。三、對於同步塊與單線程執行比較,並不存在多少性能差別,若是相比較,同步塊的執行效率還要大大低於單線程程序,若是設計差,可能仍是災難級的。由於同步自己就須要佔用系統資源和CPU片斷,並且每一個線程本身也須要佔用資源,若是多線程達不到多線程的優點,那麼它自己就會下降效率。例以下載一首歌曲爲10M,採用單線程的方式,那麼只能從開頭到結束,若是中途出現了什麼問題,那麼它就不能往下執行了,若是使用多線程,例如開闢2個線程,那麼每一個線程能夠下載5M,這就涉及到一個斷點下載的問題了,效率確定比單線程快,若是裏面包含synchronized方法,那麼第一個線程在進行任務了,忽然出現了什麼問題,那麼咱們可讓第二個線程執行任務,相比於單線程來講效率更高其實設計synchronized的目的是在使用多線程的時候從安全性方面去考慮的,例如在一個方法中修改一個全局變量,若是使用單線程固然是沒什麼問題的,一個線程進來我就本身一我的修改,也不會影響什麼,可是若是在多線程環境中,不少線程同時訪問這個方法修改全局變量,那麼就可能會出問題了,可能你爭我搶(分配到CPU資源)把這個全局變量改的不成樣子了,因此考慮安全性,咱們使用synchronized,若是有多個線程,表示大家得一個一個排隊來,若是我進去方法裏面了,那麼我就把門給鎖上,只有我一個在裏面修改全局變量,大家都不能進來,等我處理完成了,我再釋放鎖,而後讓下一個進來修改,這樣也就確保了全局變量不會被改的亂七八糟不成樣子了,由於不少項目中會有這樣的需求,因此咱們得根據需求來肯定相應的解決方案!!舉個例子來講,你有100份英語卷子,有聽力,選擇題和做文三部分;每部分作完以後,必須把100份卷子都交上來之後,才能拿下一部分。一塊兒拿下一部分的動做就叫作同步,你是拿叫一個同窗作,仍是叫100個同窗作呢?(單線程,仍是多線程)一個進程中若是有多個線程,那麼執行多線程中的非同步代碼時比一個進程只有一個線程快。若是進程中有多個線程可是每一個線程的全部代碼都須要同步的話就和進程只有一個線程的效率是相同的。線程是在進程中的,一個進程能夠有多個線程,單個線程不能脫離進程存在。因此樓主的問題就是單進程中多線程爲什麼優於多進程(每一個進程對應一個線程),當同步時,看上去也都是一個線程在執行,但前者的效率將遠遠高於後者。由於多線程是共享進程中的數據的,共享數據使得線程之間的通訊比進程間通訊更快更有效。同時,不少時候,線程相對於進程屬於輕量級的,更便於建立和銷燬。ArrayList和Vector有什麼區別?HashMap和HashTable有什麼區別?StringBuilder和StringBuffer有什麼區別?這些都是Java面試中常見的基礎問題。面對這樣的問題,回答是:ArrayList是非線程安全的,Vector是線程安全的;HashMap是非線程安全的,HashTable是線程安全的;StringBuilder是非線程安全的,StringBuffer是線程安全的。非線程安全是指多線程操做同一個對象可能會出現問題。而線程安全則是多線程操做同一個對象不會有問題。線程安全必需要使用不少synchronized關鍵字來同步控制,因此必然會致使性能的下降。因此在使用的時候,若是是多個線程操做同一個對象,那麼使用線程安全的Vector;不然,就使用效率更高的ArrayList。非線程安全!=不安全有人在使用過程當中有一個不正確的觀點:個人程序是多線程的,不能使用ArrayList要使用Vector,這樣才安全。非線程安全並非多線程環境下就不能使用。注意我上面有說到:多線程操做同一個對象。注意是同一個對象。好比最上面那個模擬,就是在主線程中new的一個ArrayList而後多個線程操做同一個ArrayList對象。若是是每一個線程中new一個ArrayList,而這個ArrayList只在這一個線程中使用,那麼確定是沒問題的。線程安全的實現線程安全是經過線程同步控制來實現的,也就是synchronized關鍵字。   ------------------------------------------------------同步異步區別--------------------------------------------------------他們最大的區別:同步須要等待,而異步無需等待。例子:普通B/S模式(同步)AJAX技術(異步)  同步:提交請求->等待服務器處理->處理完畢返回 這個期間客戶端瀏覽器不能幹別的事。異步: 請求經過事件觸發->服務器處理(這是瀏覽器仍然能夠做其餘事情)->處理完畢。說的再通俗易懂點同步是按順序執行,執行完一個再執行下一個,須要等待、協調運行。異步就是彼此獨立,在等待某事件的過程當中繼續作本身的事,不須要等待這一事件完成後再工做。線程就是異步實現的一個方式。異步是讓調用方法的主線程不須要同步等待另外一線程的完成,從而可讓主線程幹其它的事情。   異步和多線程並非一個同等關係,異步是最終目的,多線程只是咱們實現異步的一種手段。異步是當一個調用請求發送給被調用者,而調用者不用等待其結果的返回而能夠作其它的事情。實現異步能夠採用多線程技術或則交給另外的進程來處理。同步和異步區別:(好處和壞處)同步能夠避免出現死鎖,讀髒數據的發生。通常共享某一資源的時候用,若是每一個人都有修改權限,同時修改一個文件,有可能使一我的讀取另外一我的已經刪除的內容,就會出錯,同步就會按順序來修改。可是,同步須要等待資源訪問結束,浪費時間,效率低。 異步則能夠提升效率,如今cpu都是雙核,四核,異步處理的話能夠同時作多項工做,固然必須保證是能夠併發處理的。可是安全性較低。http://blog.csdn.net/xiao__gui/article/details/8934832其實,異步是目的,而多線程是實現這個目的的方法。異步是說,A發起一個操做後(通常都是比較耗時的操做,若是不耗時的操做就沒有必要異步了),能夠繼續自顧自的處理它本身的事兒,不用幹等着這個耗時操做返回  而線程的適用範圍則是那種須要長時間CPU運算的場合,例如耗時較長的圖形處理和算法執行。可是往 往因爲使用線程編程的簡單和符合習慣,因此不少朋友每每會使用線程來執行耗時較長的I/O操做。這樣在只有少數幾個併發操做的時候還無傷大雅,若是須要處 理大量的併發操做時就不合適了。異步與多線程,從辯證關係上來看,異步和多線程並不時一個同等關係,異步是目的,多線程只是咱們實現異步的一個手段.什麼是異步:異步是當一個調用請求發送給被調用者,而調用者不用等待其結果的返回.實現異步能夠採用多線程技術或則交給另外的進程來處理=========================================================================線程池的實現方法與線程是不同的.初始化時在線程池裏的線程爲0.當進程須要一個線程時,建立一個線程,由此線程執行用戶的方法.須要注意的是,此線程執行完後並不當即銷燬,而是掛起等待,若是有其餘方法須要執行,回喚醒進行處理.只有當它等到40秒(沒有官方記錄,有多是其它數字)尚未任務執行時才喚醒本身,並銷燬本身,釋放資源.固然,若是線程池中的線程不夠處理任務時,會再次建立一個新線程進行執行.異步執行也得執行,不在當前線程執行,固然得去另一個線程執行。異步一般用系統線程池的線程,一般狀況下性能好些。(由於能夠屢次利用,申請時不須要從新申請一個線程,只須要從池裏取就好了。)異步是一種效果,多線程是一種具體技術。能夠說,用「多線程」實現「異步」。異步和多線程是兩個不一樣的概念,不能這樣比較.異步請求通常用在IO等耗時操做上,他的好處是函數調用當即返回,相應的工做線程當即返還給系統以供重用。因爲系統的線程資源是很是寶貴的,一般有必定的數目限制,如.net默認是25。若使用異步方式,用這些固定數目的線程在固定的時間內就能夠服務更多的請求,而若是用同步方式,那麼每一個請求都自始至終佔用這一個線程,服務器能夠同時服務的請求數就少了。當異步操做執行完成後,系統會從可用線程中選取一個執行回調程序,這時的這個線程多是剛開始發出請求的那個線程,也多是其餘的線程,由於系統選取線程是隨機的事情,因此不能說絕對不是剛開始的那個線程。多線程是用來併發的執行多個任務。不過有個問題,異步有時優先級比主線程還高。這個特色和多線程不一樣。
相關文章
相關標籤/搜索