Java後端每日學點系列?執行緒知否,List懂否,垃圾回收器曉得否

語言: CN / TW / HK

:maple_leaf: 作者:知識淺談,CSDN部落格專家,阿里雲簽約博主,InfoQ簽約博主,華為云云享專家

:pushpin: 擅長領域:全棧工程師、爬蟲、ACM演算法

:wedding: 公眾號:知識淺談

這次都給他拿下

正菜來了:golf::golf::golf:

:balloon:執行緒安全的定義?實現執行緒安全的方式有哪些?

執行緒安全:當多個執行緒訪問同一資源的的時候,不需要考慮多個執行緒對同一資源的併發訪問造成不正確的結果,不需要進行同步控制來達到執行緒安全。

實現執行緒安全的方式:

  1. 加Synchronized鎖,通過加鎖來形成不會對同一資源併發操作的時候造成不正確的結果。
  2. 使用互斥變數,使用者此變數達到一個同步的結果。
  3. 使用Lock鎖機制,對執行緒不安全的程式碼塊加lock鎖。

:balloon:執行緒池理解嗎?核心引數和執行流程?

​溫馨提醒:這個有點多,請仔細看下去​執行緒池 :之所以存線上程池,是針對單獨執行緒在管理上等不同的方面所體現出的優勢。

  1. 減少資源消耗:因為單執行緒頻繁的建立和銷燬會消耗資源的,所以使用執行緒池可以把建立的執行緒儲存起來,使用的時候直接分配,不用頻繁的建立和銷燬,減少了資源的消耗。
  2. 便於執行緒的管理:如果執行緒是一個一個去建立的,需要我們一個個去管理,當使用執行緒池的時候,就交給執行緒池管理了。
  3. 執行緒池的靈活性:我們可以根據業務手動的設定執行緒池的引數,來靈活的控制像是阻塞佇列,以及核心執行緒數等這些引數。

執行緒池核心引數:

kernel_size:核心執行緒數

max_size:最大執行緒數

blocking_queue:阻塞佇列

keep_alive:非核心執行緒沒有執行任務的時候存活的時間

Time_unit:存活時間的時間單位

Thread_factory:執行緒工廠

strategy: 策略

執行流程:

剛開始的時候執行緒池為空,任務來了之後檢視是否有空閒的執行緒,有的話直接執行,沒有的話檢視執行緒池中的執行緒數是不是小於核心執行緒數,小於的話,建立執行緒並執行任務,如果不小於的話,檢視阻塞佇列是否已經滿了,未滿的話放入阻塞佇列,滿的話,檢視執行緒池中的執行緒數是否小於最大執行緒數,小於的話,建立非核心執行緒執行任務,如果執行緒池中的執行緒數等於的話

,進行拋棄策略,包含四種策略:直接拋棄,拋棄並丟擲異常,刪除佇列中時間最長的任務,並把當前任務加入佇列,返回給呼叫執行緒池執行任務的執行緒執行。

:balloon:ArrayList和LinkedList的區別?

首先,兩個都是java中的列表,但是其在不同的操作上效率不同,可根據不同的業務選用不同的列表型別。

從結構上:

  • ArrayList是以陣列的形式儲存資料的,便於查詢指定位置的資料,但是在插入刪除可能會比較慢,插入一個數據之後,該資料後邊的資料都要向後移動一位,同樣刪除一個數據之後,該資料後邊的資料都要向前移動一位。
  • LinkedList是以連結串列的形式儲存資料的,便於增加刪除資料,但是對於查詢某一個位置的資料,需要進行遍歷,從頭遍歷到指定的位置,然後返回。
  • 從擴容上:

    • ArrayList是以陣列的形式,初始的大小為10,當記憶體不夠的時候以1.5倍的大小增加。
    • LinkedList是以連結串列的形式,通過資料的增加,長度也增加。

    :balloon:說說G1和CMS的區別?優缺點等

    G1:既是併發的又是並行的一種垃圾回收器,並行體現在年輕代的垃圾回收,不同的區域同時進行垃圾回收,併發體現在併發標記混合回收階段,總共包含一下階段:初始標記,根區域掃描,併發標記(刪除區域內全為垃圾的區域),重新標記,獨佔清理(對不同區域垃圾佔比進行排序),混合回收。

    CMS:是一種併發的垃圾回收器,常用於老年代,使用的為標記清理方法,包含以下階段:初始標記,併發標記,重新標記,併發清理,併發重置。

    G1:

    優點:在多CPU的環境下處理的效率比較高。

    缺點:在多CPU和資源的條件下才能發揮出來優勢,否則其效率就降低了。

    CMS:

    優點:因為併發標記和併發清理減少STW的時間,所以響應效率比較高

    缺點:但是需要進行上下文的切換,也會有一定的資源消耗,在多cpu的環境比較能發揮CMS的效能。因為其標記清除的垃圾回收方法產生碎片,CMS處理器無法處理浮動垃圾。

    :rice:總結

    以上就是關於三者的總結:執行緒知否,List懂否,垃圾回收器曉得否。