一、概念
什麼是線程
- 一個線程要執行任務,必須得有線程一個進程(程序)的所有任務都在線程中執行的一個線程執行任務是串行的,也就是說一個線程,同一時間內,只能執行一個任務
多線程原理
- 同一時間,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這行,技術發展過於快速,如果沒有學習新知識的動力,終究會被淘汰。
閱讀更多 有頭髮就是菜 的文章