阿里一面被Java併發搞“崩潰”後,苦修30天看完這些祕籍信心爆棚

一、概念

什麼是線程

  • 一個線程要執行任務,必須得有線程一個進程(程序)的所有任務都在線程中執行的一個線程執行任務是串行的,也就是說一個線程,同一時間內,只能執行一個任務

多線程原理

  • 同一時間,CPU只能處理1條線程,只有一條線程在工作(執行)多線程併發(同時)執行,其實質是CPU快速的在多線程之間調度(切換)

如果線程過多,會怎樣?

  • CPU在N多條線程中調度,會消耗大量的cpu資源每條線程被調度執行的頻率越低(線程的執行效率低)

多線程的優點

  • 能適當提高程序的執行效率能適當提高資源的利用率(CPU 內存利用率等)

多線程的缺點

  • 創建線程是有開銷的,iOS下主要成本包括:內核數據結構(大約1KB)、棧空間(子線程512KB、主線程1MB,也可以使用-setStackSize:設置,但必須是4K的倍數,而且最小是16K),創建線程大約需要90毫秒的創建時間如果開啓大量的線程,會降低程序的性能程序越多CPU的線程上的開銷就越大程序設計更加複雜:線程之間的通訊,多線程的數據共享

主線程的主要作用

  • 顯示和刷新UI界面處理UI事件(比如點擊事件,滾動事件,拖拽事件等)

主線程的使用注意

  • 別將比較耗時的操作放在主線程中,會導致UI界面的卡頓將耗時操作放在子線程(後臺線程,非主線程)

二、多線程的4種方案

阿里一面被Java併發搞“崩潰”後,苦修30天看完這些祕籍信心爆棚

三、常見多線程面試題:

下面這些是大廠面試官在不同時間不同地點喜歡問的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併發搞“崩潰”後,苦修30天看完這些祕籍信心爆棚

Java 線程池相關問題

阿里一面被Java併發搞“崩潰”後,苦修30天看完這些祕籍信心爆棚

Java內存模型相關問題

阿里一面被Java併發搞“崩潰”後,苦修30天看完這些祕籍信心爆棚

參考解析文檔

爲了不影響閱讀,有需要的朋友麻煩轉發後關注我點擊這裏即可免費獲取!

阿里一面被Java併發搞“崩潰”後,苦修30天看完這些祕籍信心爆棚

四、多線程併發的學習思路:

只能這麼清晰了,有需要Xmind源文件的朋友麻煩轉發後關注我點擊這裏即可免費獲取!

阿里一面被Java併發搞“崩潰”後,苦修30天看完這些祕籍信心爆棚

附上我的Java併發學習筆記和收集的學習視頻

  • JAVA併發知識庫
  • JAVA線程實現/創建方式
  • 4種線程池
  • 線程生命週期(狀態)
  • 終止線程4種方式
  • sleep與wait區別
  • start與run區別
  • JAVA後臺線程
  • JAVA鎖
  • 線程基本方法
  • 線程上下文切換
  • 同步鎖與死鎖
  • 線程池原理
  • JAVA阻塞隊列原理

阿里一面被Java併發搞“崩潰”後,苦修30天看完這些祕籍信心爆棚

我的Java併發編程學習視頻

阿里一面被Java併發搞“崩潰”後,苦修30天看完這些祕籍信心爆棚

阿里一面被Java併發搞“崩潰”後,苦修30天看完這些祕籍信心爆棚

五、總結

其實,很多面試官都清楚,初級程序員對於多線程的掌握度幾乎爲零。但是面試環節中,很多面試官都會抱着試一試的態度去提問一兩道多線程的題目。其目的不是爲了難爲面試者,也不是爲了彰顯面試的“高大上”,而是爲了區分一般人才與優質人才。最後一點大家謹記:

在找工作的時候,除了做些相關面試和準備熟悉以前做的項目之外,還應該學習新的知識。畢竟,每多學一點,成功找到工作的機會就大一點。而且,IT這行,技術發展過於快速,如果沒有學習新知識的動力,終究會被淘汰。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章