一、概念
什麼是線程
多線程原理
同一時間,CPU只能處理1條線程,只有一條線程在工作(執行)多線程併發(同時)執行,其實質是CPU快速的在多線程之間調度(切換)如果線程過多,會怎樣?
CPU在N多條線程中調度,會消耗大量的cpu資源每條線程被調度執行的頻率越低(線程的執行效率低)多線程的優點
能適當提高程序的執行效率能適當提高資源的利用率(CPU 內存利用率等)多線程的缺點
創建線程是有開銷的,iOS下主要成本包括:內核數據結構(大約1KB)、棧空間(子線程512KB、主線程1MB,也可以使用-setStackSize:設置,但必須是4K的倍數,而且最小是16K),創建線程大約需要90毫秒的創建時間如果開啟大量的線程,會降低程序的性能程序越多CPU的線程上的開銷就越大程序設計更加複雜:線程之間的通訊,多線程的數據共享主線程的主要作用
顯示和刷新UI界面處理UI事件(比如點擊事件,滾動事件,拖拽事件等)主線程的使用注意
別將比較耗時的操作放在主線程中,會導致UI界面的卡頓將耗時操作放在子線程(後臺線程,非主線程)二、多線程的4種方案
三、常見多線程面試題:
下面這些是大廠面試官在不同時間不同地點喜歡問的Java線程問題。有參考的解析,但僅限於參考,有些時候這些參考足夠回答問題。
1.Synchronized 用過嗎,其原理是什麼?
這是一道Java面試中幾乎百分百會問到的問題,因為沒有任何寫過併發程序的開發者會沒聽說或者沒接觸過Synchronized。
Synchronized 是由JVM實 現的一種實現互斥同步的一種方式 ,如果你查看被Synchronized 修飾過的程序塊編譯後的字節碼,會發現,被Synchronized修飾過的程序塊,在編譯前後被編譯器生成了monitorenter和monitorexit兩個字節碼指令
2.你剛才提到獲取對象的鎖, 這個“ 鎖” 到底是什麼? 如何確定對象的鎖?
“ 鎖” 的本質其實是 monitorenter 和 monitorexit 字節碼指令的一個 Reference類型的參數, 即要鎖定和解鎖的對象。 我們知道, 使用Synchronized 可以修飾不同的對象, 因此, 對應的對象鎖可以這麼確定。
1.如果 Synchronized 明確指定了鎖對象, 比如 Synchronized( 變量名) 、 Synchronized( this) 等, 說明加解鎖對象為該對象。
2.如 果 沒 有 明 確 指 定 :若 Synchronized 修飾的方法為非靜態方法, 表示此方法對應的對象為鎖對象;若 Synchronized 修飾的方法為靜態方法, 則表示此方法對應的類對象為鎖對象。注意, 當一個對象被鎖住時, 對象裡面所有用 Synchronized 修飾的方法都將產生堵塞, 而對象裡非 Synchronized 修飾的方法可正常被調用, 不受鎖影響。
3.JVM 對 Java 的原生鎖做了哪些優化?
4.為什麼說 Synchronized 是非公平鎖?
可重入鎖ReentrantLock及其他顯式鎖相關問題
Java 線程池相關問題
Java內存模型相關問題
參考解析文檔
為了不影響閱讀,有需要的朋友麻煩轉發後關注我私信回覆【併發】即可免費獲取!
四、多線程併發的學習思路:
只能這麼清晰了,有需要Xmind源文件的朋友麻煩轉發後關注我私信回覆【併發】即可免費獲取!
附上我的Java併發學習筆記和收集的學習視頻
JAVA併發知識庫JAVA線程實現/創建方式4種線程池線程生命週期(狀態)終止線程4種方式sleep與wait區別start與run區別JAVA後臺線程JAVA鎖線程基本方法線程上下文切換同步鎖與死鎖線程池原理JAVA阻塞隊列原理....我的Java併發編程學習視頻
五、總結
其實,很多面試官都清楚,初級程序員對於多線程的掌握度幾乎為零。但是面試環節中,很多面試官都會抱著試一試的態度去提問一兩道多線程的題目。其目的不是為了難為面試者,也不是為了彰顯面試的“高大上”,而是為了區分一般人才與優質人才。最後一點大家謹記:
在找工作的時候,除了做些相關面試和準備熟悉以前做的項目之外,還應該學習新的知識。畢竟,每多學一點,成功找到工作的機會就大一點。而且,IT這行,技術發展過於快速,如果沒有學習新知識的動力,終究會被淘汰。