1. 程式人生 > >Java面試專題-多執行緒篇(2)- 鎖和執行緒池

Java面試專題-多執行緒篇(2)- 鎖和執行緒池

 

開篇介紹

大家好,公眾號【Java極客思維】近期會整理一些Java高頻面試題分享給小夥伴,也希望看到的小夥伴在找工作過程中能夠用得到!本章節主要針對Java一些多執行緒高頻面試題進行分享。

 

Q1:

樂觀鎖 和 悲觀鎖

樂觀鎖:

樂觀鎖(Optimistic Locking)其實是一種思想。相對悲觀鎖而言,樂觀鎖假設認為資料一般情況下不會造成衝突,所在資料進行提交更新的時候,才會正式對資料的衝突與否進行檢測,如果發現衝突了,則讓返回使用者錯誤的資訊,讓使用者決定如何去做。

 

悲觀鎖:

Java在JDK1.5之前都是靠 synchronized 關鍵字保證同步的,這種通過使用一致的鎖定協議來協調對共享狀態的訪問,可以確保無論哪個執行緒持有共享變數的鎖,都採用獨佔的方式來訪問這些變數。獨佔鎖就是一種悲觀鎖,所以可以說:synchronized是悲觀鎖 。

 

Q2:

synchronized內建鎖

用處:

synchronized作為執行緒同步的關鍵字,設計到鎖的概念,Java內建鎖是一個互斥鎖,這就說明最多隻有一個執行緒能夠獲得該鎖,例如執行緒A 和 執行緒B,如果執行緒A嘗試去獲得執行緒B的內建鎖,則執行緒A必須等待或者阻塞,直到執行緒B釋放這個鎖為止;如果執行緒B永不釋放這個鎖,那麼執行緒A將永遠處於等待或者阻塞狀態。Java的物件鎖和類鎖在鎖的概念上,與內建鎖幾乎是一致的,但是物件鎖和類鎖的區別是非常大的。

 

物件鎖:

用synchronized關鍵字修飾非靜態方法、用synchronized(this)作為同步程式碼塊,用synchronized(非this物件)的用法,鎖的是物件,執行緒想要執行對應的同步程式碼,需要先獲得物件鎖。

 

類鎖:

用synchronized修飾靜態方法、用synchronized(類.class)的用法,鎖的是類,執行緒想要執行對應的同步程式碼,需要先獲得物件鎖。

 

物件鎖:鎖的是類的物件例項;

類鎖:鎖的是每個類的Class物件,每個類的Class物件在虛擬機器中只有一個,所以類鎖也只有一個。

 

Q3:

樂觀鎖一定就是好的嗎?

樂觀鎖避免了悲觀鎖獨佔物件的現象,同時也提高了併發效能,但是也有以下幾個缺點:

1. 樂觀鎖只能保證一個共享變數的原子操作。如果多一個或者幾個變數,樂觀鎖將變得力不從心;

(但互斥鎖能輕易解決,不管物件數量多少以及物件顆粒度大小。)

2. 長時間自旋可能導致開銷大。假如CAS長時間不成功就會一直自旋,會給CPU帶來非常巨大的開銷

3. ABA問題。CAS的核心思想是通過對比記憶體值與預期值是否一致而判斷記憶體值是否被改動過,但這個判斷邏輯不夠嚴謹,例如:假如A同學倒了一杯水放桌子上,然後有事去忙,此時B同學經過,看到桌子上的水,然後喝了半杯,喝完後再將水打滿,實際看起來還是一杯水,但是這杯水已經不是A同學的那一杯水了,且實際上水是已經被B同學改過了,這種情況對依賴過程值的情景的運算結果影響很大。

解決的方案:通過引入版本號,每次變數更新都把版本號加1.

 

Q4:

執行緒池的啟動策略?

執行緒池的執行過程.png

1. 執行緒池剛建立時,裡面沒有一個執行緒。任務佇列是作為引數傳進來的。不過就算佇列裡面有任務,執行緒池也不會馬上執行它們。

2. 當呼叫 execute() 方法新增一個任務時,執行緒池會做如下判斷:

  • 如果正在執行的執行緒數量小於 corePoolSize ,那麼馬上建立執行緒執行這個任務;

  • 如果正在執行的執行緒數量大於或等於 corePoolSize , 那麼將這個任務放入佇列;

  • 如果這時候佇列滿了,而且正在執行的執行緒數量小於 maximumPoolSize ,那麼還是要建立執行緒執行這個任務;

  • 如果佇列滿了,而且正在執行的執行緒數量大於或等於 maximumPoolSize ,那麼執行緒池會丟擲異常,告知呼叫者"我不能再接受任務了"。

3. 當一個執行緒完成任務時,它會從佇列中取下一個任務來執行。

4. 當一個執行緒無事可做,超過一定的時間 (keepAliveTime) 時,執行緒池會進行判斷,如果當前執行的執行緒數大於 corePoolSize ,那麼這個執行緒就會被停掉。所以執行緒池的所有任務完成後,它最終將會收縮到 corePoolSize 大小。

 

明天,會介紹多執行緒一些深入的知識,長按二維碼關注我吧~

祝大家都能拿到心儀的offer!

 


點關注、不迷路

如果覺得文章不錯,歡迎關注、點贊、收藏,你們的支援是我創作的動力,感謝大家。

如果文章寫的有問題,請不要吝嗇,歡迎留言指出,我會及時核查修改。

如果你還想更加深入的瞭解我,可以微信搜尋「Java極客思維」進行關注。每天8:00準時推送技術文章,讓你的上班路不在孤獨,而且每月還有送書活動,助你提升硬實