併發與多線程

知識點彙總java

1、死鎖

1.1 競爭條件與臨界區mysql

1.2 死鎖檢測與防止面試

1.3 產生條件
  互斥
  請求並持有
  非剝奪
  循環等待sql

2、線程的狀態與轉換

NEW:建立多線程

RUNNABLE:可運行併發

REDAY:就緒態異步

RUNNING:運行態工具

BLOCKED:獲取鎖失敗進入BLOCKED狀態,獲取鎖時進入REDAY態優化

TIME_WAITING:超時等待ui

WAITING:無超時等待

TERMINATED:結束

 掌握5種狀態便可(新建、就緒、運行、阻塞、死亡)

3、線程同步與互斥解決方法

  一、CAS
  二、synchronize
  三、lock

3.1 CAS

  CAS是樂觀鎖,輕量級鎖,經過比較值是否被更改來判斷。

  缺點:可能會出現的ABA(上圖右)的問題,不必定會影響結果,解決辦法是提供額外的標誌位或者時間戳(相似於mysql version字段)。

3.2 synchronize

  方法同步:經過java的高級字節碼指令ACC_SYNCCHRONIZED標誌來實現。

  代碼塊同步:經過java的兩個高級字節碼指令monitorenter和monitorexit來實現。

  鎖優化機制:

  一、偏向鎖:先使用偏向鎖
  二、輕量鎖:獲取偏向鎖失敗則升級爲CAS輕量鎖
  三、自旋鎖:獲取輕量鎖失敗,則進行短暫的自旋
  四、重量級鎖:以上都失敗則升級爲重量級鎖

3.3 AQS和LOCK

 

 

 lock鎖代碼塊,相似與cas

4、線程池

  一、固定大小線程池:線程池固定,使用的是無界緩衝隊列,適用於任務數量不均勻的場景,也適用於對內存壓力不敏感,對系統負載比較敏感的場景。

  二、Cached線程池:不限制建立的線程數,適用於要求低延遲的短時間任務的場景。

  三、單線程線程池:一個線程的固定線程池,適用於須要異步執行,但要保證線程執行順序的場景。

  四、Scheduled線程池:適用於按期執行任務的場景,支持按固定的頻率或者固定延時來執行的場景。

  五、工做竊取線程池:適用於任務時長不均勻的場景。

4.1 線程池參數介紹

參數介紹:
  corePoolSize:核心線程數,核心線程會一直存活。
  maximumPoolSize:最大線程數,決定線程池最多能夠建立多少線程。
  keepAliveTime:空閒時間,當線程閒置超過空閒時間時就會被銷燬。
  uint:空閒時間的單位。
  workQueue:緩衝隊列
  ArrayBlockingQueue:有界隊列,有最大容量閒置。
  LinkedBlockingQueue:無界隊列,不限制容量。
  SynchronousQueue:同步隊列,內部沒有緩衝區。
  threadFactory:設置線程池工廠方法,用來建立新的線程方法,能夠對線程的屬性進行定製,例如線程的group,線程名等,通常使用默認的工廠類便可。
  handler:線程池滿時的拒絕策略,
  Abort:線程池滿後,提交新任務時,會拋出異常,默認拒絕策略。
  Discard:線程池滿後,提交新任務時,對任務進行丟棄。
  CallerRuns:線程池滿後,提交新任務時,會直接執行提交的任務。
  DiscardOldest:線程池滿後,提交新任務時,會丟棄最先提交的任務。
各種線程池調用參數方法:
  固定大小線程池:
    corePoolSize和maximumPoolSize:設置成指定的線程數
    workQueue:LinkedBlockingQueue
  Cached線程池:
    corePoolSize:0
    maximumPoolSize:Integer.MAX_VALUE
    keepAliveTime:60
    workQueue:SynchronousQueue
  單線程線程池:
    corePoolSize和maximumPoolSize:1
  Scheduled線程池:
    workQueue:DelayWorkQueue,按延遲時間獲取任務的優先級隊列

4.2 線程池任務執行流程

調用方法:
  一、execute
  二、submit:能夠返回一個future對象,根據future對象能夠了解任務的執行狀況,能夠取消任務的執行,還能夠獲取任務的執行結果或者執行異常。

5、JUC經常使用工具

用於處理多線程常見問題的庫

表格第一行:基本數據類型的原子類。

表格第二行:對對象提供的原子類。

 

表格第一行:鎖相關的類。

表格第二行:異步執行相關的類。

 

表格第一行:經常使用的阻塞隊列。

表格第二行:控制多線程協做使用的類。

表格第三行:經常使用的併發集合。

面試考察點與真題

三、jstack分析線程的運行狀態

 

四、wait與sleeep的區別

  wait:Object方法,會釋放對象鎖,須要在同步塊中使用,不須要捕獲異常。
  sleep:Thread方法,不會釋放對象鎖,任何地方使用,須要捕獲異常。
六、適用於讀併發多,寫併發少的場景,也可以使用CopyOnWrite解決。

七、wait、notify機制,共享變量的sync和lock同步機制

八、cas、sync、lock、ThreadLocal等機制

九、減小臨界區範圍、使用ThreadLocal、減小線程切換、使用讀寫鎖或CopyOnWrite等機制

十、ThreadLocal不是解決線程數據共享的問題,是解決數據隔離的問題。

相關文章
相關標籤/搜索