轉 :2019年Java大廠面試(吐血超詳細總結)

2019年Java大廠面試(吐血超詳細總結)

本文來自於慕課網手記Java大廠面試(吐血超詳細總結),轉載請保留鏈接 ;)

轉載自:https://www.imooc.com/article/286545#%E7%A6%8F%E7%B1%B3%E7%A7%91%E6%8A%80

這是我今年從四月份開始,主要的大廠面試經歷,有些企業面試的還沒來得及整理,還有些沒有帶答案就發出來了,不管怎樣,請各位先思考如果是你怎麼回答面試官?這篇文章會持續更新,請各位持續關注,希望對你有所幫助!

面試清單

平安產險

先通過郵件發了一份線上測評(EQ+IQ), 做完達到要求後纔能有後續的面試機會,沒有通過兩年之內不能進平安任何一家公司。

一面

自我介紹

看我工作時間不長,問我爲什麼頻繁跳槽(間接問離職原因)

關注過平安哪些架構?

我就說了軍哥的pass平臺

解釋下什麼是用戶態和內核態?兩者有什麼區別?

內核態:當一個任務(進程)執行系統調用而陷入內核代碼中執行時,我們就稱進程處於內核運行態(或簡稱爲內核態)。其他的都屬於用戶態

用戶程序運行在用戶態,操作系統運行在內核態(操作系統內核運行在內核態,而服務器運行在用戶態)。用戶態不能干擾內核態.所以CPU指令就有兩種,特權指令和非特權指令.不同的狀態對應不同的指令。特權指令:只能由操作系統內核部分使用,不允許用戶直接使用的指令。
如:I/O指令、置終端屏蔽指令、清內存、建存儲保護、設置時鐘指令(這幾種記好,屬於內核態)。非特權指令:所有程序均可直接使用。

所以:

系統態(核心態、特態、管態):執行全部指令。

用戶態(常態、目態):執行非特權指令。

用戶態和內核態的理解和區別

用過Spring boot哪些版本?新版本相對於舊版本有哪些改變?

https://github.com/spring-projects/spring-boot/wiki

Spring Boot 2.x 與 1.x 的區別,以及如何做版本遷移

web.xml中DispatcherServlet的作用?

Spring MVC中的DispatcherServlet作用

DispatcherServlet過程詳解

講下web.xml中Filter類(過濾器)

web.xml中的配置,servlet,filter,listener的作用和原理

使用Spring boot以後,與之前系統的配置方式區別方面?(Spring boot 和 Spring MVC 使用和配置上的區別?)

SpringBoot - 註冊Servlet、Filter和Listener(代碼和註解兩種方式)

spring boot與spring mvc的區別是什麼?

好像還有個reactivity什麼的,當時記不清了。

你們如果面試碰到了相關經典題目。歡迎補充!

二面

整理中

飛豬

首先這個面試機會是來自於內推,當然內推的人和我一面的面試官都是同一個人,所以 嘿嘿嘿 你懂得…

第一次面試(2019年3月13日)

自我介紹

介紹一下你這邊最熟悉的項目?在開發過程中印象最深刻地方?

Springboot 2.0.0和Springboot 1.5.6的區別?

https://github.com/spring-projects/spring-boot/wiki

Spring Boot 2.x 與 1.x 的區別,以及如何做版本遷移

有沒有看過Springboot的源碼?(很尷尬,沒有研究過)

https://github.com/spring-projects/spring-boot

Springboot中遇到的一些坑及解決方法?

Springboot與shiro整合遇到的坑

Spring Boot 從1.0 升級到 2.0 所踩的坑

有沒有看過Spring的源碼?(很尷尬,瞭解過)

https://github.com/spring/spring

你現在對Dubbo瞭解得怎麼樣?(作爲這個項目的貢獻者,沒有深入閱讀源碼和實踐真的是汗顏)

https://github.com/apache/incubator-dubbo

30 道 Dubbo 面試題及答案

JDK 1.9 的新特性?(我說:沒有用過1.9,感覺1.9不是很穩定,只用過1.8)那說一下 1.8 有哪些新特性?

jdk8, jdk8u, jdk9, jdk10的側重和區別是什麼?

JDK 9新特性彙總

JDK1.8新特性(持續更新)

JDK有哪些實現代理方法?JDK動態代理和CGlib動態代理有什麼區別?

深入理解靜態代理與JDK動態代理

JDK動態代理與CGLib動態代理相關問題

介紹下OOM?開發過程中遇到過哪些OOM,怎樣解決的?

OutOfMemoryError,當JVM因爲沒有足夠的內存來爲對象分配空間,並且垃圾回收器也已經沒有空間可回收時,就會拋出這個error(注:非exception,因爲這個問題已經嚴重到不足以被應用處理)。

因爲OutOfMemoryError是可以catch的。catch之後吞掉的話程序還能試着繼續運行。例如說以前見過的一個案例是:一個Java服務器端應用,有段代碼沒寫對導致有一個線程在瘋狂創建大數組對象——直到OOM。這個線程註冊的uncaught exception handler捕獲到了這個異常,記錄了日誌,然後就把這個異常吞掉了。這樣還能繼續正常跑下去是因爲:只是一個創建很大的數組對象的請求失敗了而已,而出錯的那個方法由於異常處理已經被退出了,程序的其它部分並沒有受影響。

JVM 發生 OOM 的 8 種原因、及解決辦法

介紹下Java內存模型?

Java內存模型(JMM)總結

你這邊還有什麼問題?

第二次面試(2019年12月29日)

自我介紹

面試中自我介紹雖然很常見,我覺得很有必要根據不同公司,不同的JD來寫幾份不同的自我介紹,以備不時之需。

最新項目中主要負責哪一塊?運用了哪些技術?項目整體架構是怎樣的?

Java ClassLoader ? 雙親委派?

老大難的 Java ClassLoader 再不理解就老了

消息隊列 RocketMQ 版消費失敗如何重新消費消息?

集羣消費方式

消費業務邏輯代碼如果返回 Action.ReconsumerLater,或者 NULL,或者拋出異常,消息都會走重試流程,至多重試 16 次,如果重試 16 次後,仍然失敗,則消息丟棄。可以通過調用 message.getReconsumeTimes() 方法來獲取消息的重試次數。

廣播消費方式

廣播消費方式仍然能保證一條消息至少被消費一次,但消費失敗後不做重試操作。

消息隊列常見問題和解決方案

消息隊列消費場景:A扣錢成功,調用B加錢接口失敗。

  • 強一致性,分佈式事務(難落地)
  • 最終一致性,主要是用“記錄”和“補償”的方式。在做所有的不確定的事情之前,先把事情記錄下來,然後去做不確定的事情,結果可能是:成功、失敗或是不確定,“不確定”(例如超時等)可以等價爲失敗。成功就可以把記錄的東西清理掉了,對於失敗和不確定,可以依靠定時任務等方式把所有失敗的事情重新搞一遍,直到成功爲止。

最後,系統在A扣錢成功的情況下,把要給B“通知”這件事記錄在庫裏(爲了保證最高的可靠性可以把通知B系統加錢和扣錢成功這兩件事維護在一個本地事務裏),通知成功則刪除這條記錄,通知失敗或不確定則依靠定時任務補償性地通知我們,直到我們把狀態更新成正確的爲止。

高併發之消息隊列

分佈式事務場景:商城一次支付過程。用戶下單使用組合支付,即餘額加紅包支付。但是在調用紅包系統扣減紅包系統失敗,如何解決?

引入 TCC 事務,將整個下單過程作爲一個整體。引入後,由於餘額系統扣減是失敗,這個時候我們回滾訂單系統與紅包系統。由於餘額系統的失敗,我們需要撤銷這次過程中所有更改,所以我們向訂單系統發送撤銷通知,向紅包系統發出撤銷通知。

聊聊分佈式事務

數據庫操作:左連接 ,右連接

left join (左連接):返回包括左表中的所有記錄和右表中連接字段相等的記錄。

right join (右連接):返回包括右表中的所有記錄和左表中連接字段相等的記錄。

左連接 ,右連接,內連接和全外連接的4者區別

算法題:有一棟100層高樓,從某一層開始扔下的玻璃球剛好摔壞,現有兩個玻璃球,試用最簡便的方法確定這個恰好摔壞玻璃球的那層。

第一個玻璃球用來找到摔壞的樓層範圍,第二個玻璃球找到具體摔壞球的樓層。

假設一開始從第k層投,如果壞了,那麼第二個球可以在剩下的k-1層一定能用k-1次確定哪層壞,再加上第k層的那次,所以總共k次。如果第k層沒有壞,那麼第一個球在第k層的基礎上再加k-1層(注意不是k層,原因見後面),所以第二次從2k-1層投下,在k,k+1,k+2,……,2k-2,2k-1中則有k-2層,所以用k-2次才能找出,再加上原來的那兩次,還是共用了k次(爲了保持總共還是k次,所以上面只能加k-1層)。

依次類推,在第2k-1層基礎上再加k-2層,在第3k-3層基礎上再加k-3層,……,依次類推,一定能加到在第某層的基礎上再加2層,最後再原來的基礎上面還能再加1層,到目前爲止,設爲第n-1層,如果第n-1層壞了,那麼就是第n-1層,如果沒有壞,根據已知題說某一層能摔碎球,那麼在第n-1層上面有且僅還有一層就是剛摔壞的層(此時不需要實際投,而是直接推理得出),這時用的次數還是k次(最不理想的結果),所以k次能測最多n層,由上面的解說,可知n-1=k+(k-1)+(k-2)+(k-3)+……+2+1=k(k+1)/2,得n=k(k+1)/2+1,由上面可知n=100(層),k次最多能推測k(k+1)/2+1(層),所以k(k+1)/2+1≥100,得k(k+1)≥198,且k的最小整數爲14,所以最多14次就能找出題目中的那層。

補充:由上得知,第一次在14層投,第二次在第27層投,則依次爲14 27 39 50 60 69 77 84 90 95 99。還能得出14次最多能測得到106樓,只不過題目中給了100樓,如果是107樓,那麼就需要15次了。

用2個玻璃球找到從一100層的大樓的某一層落下剛好會摔碎,如何制定最優策略?

給你兩個球,100層樓,每個球在一定高度扔下去會碎,怎麼用最少的次數給判斷是幾層樓能把求摔碎?

平時是怎樣學習新知識的?

你有平時寫博客的習慣嗎?

你這邊還有什麼問題?

我覺得我這次表現的不是太好,你有什麼建議或者評價給我嗎?

阿里招人級別的標準,現在是不是越來越難了?

上汽大通

一套J2EE+Oracle的筆試 大概有五六張紙 我只依稀記得幾道題

現場面試

main方法中是否可以調用非靜態方法

可以,一種方法將main方法寫成靜態方法,另一種將當前類實例化再調用它的非靜態方法,例如:

public class Test {
private int a;
public int getnumber() {
setnumber(8);
return this.a;
}
public int setnumber (int a) {
return this.a=a;
}
public static void main(String args[]){

}
}

改爲:

public class Test {
    private int a;
 
    public int getnumber() {
        setnumber(8);
        return this.a;
    }
 
    public int setnumber(int a) {
        return this.a = a;
    }
 
    public static void main(String args[]) {
        Test t = new Test();
//      t.setnumber(10);
        int a = t.getnumber();
        System.out.println(a);
    }
}

解釋下AOP和IOC的工作機制?

AOP思想的實現一般都是基於代理模式 ,在JAVA中一般採用JDK動態代理模式,但是我們都知道,JDK動態代理模式只能代理接口而不能代理類。因此,Spring AOP 會這樣子來進行切換,因爲Spring AOP 同時支持 CGLIB、ASPECTJ、JDK動態代理。

Spring IOC的初始化過程:

XML ------> Resource ------> BeanDefinition ------> BeanFactory

如何理解Spring中的IOC和AOP

servlet的生命週期

javax.servlet.Servlet接口中的init()、service()和destroy()方法來表示,主要包括四個階段:

  • 加載和實例化
  • 初始化
  • 請求處理
  • 服務終止

String、StringBuffer和StringBuilder三者區別?

JAVA中String與StringBuffer,StringBuilder的區別

StringBuffer 和 StringBuilder 的區別是什麼?

怎麼實現synchronized的可重入?

synchronized是可重入的,對同一個執行線程,它在獲得了鎖之後,在調用其他需要同樣鎖的代碼時,可以直接調用。

可重入是通過記錄鎖的持有線程和持有數量來實現的,當調用synchronized保護的代碼時,檢查對象是否已被鎖,如果是,再檢查是否被當前線程鎖定,如果是,增加持有數量,如果不是被當前線程鎖定,才加入等待隊列,當釋放鎖時,減少持有數量,當數量爲0時才釋放整個鎖。

synchronized 關鍵字

RuntimeException和Exception的區別?

java基礎學習(12)RuntimeException和Exception

wait()和sleep()的區別?

sleep( ) 和 wait( ) 的這 5 個區別,你知道幾個?

有三個線程t1、t2、t3。確保三個線程t1執行完後t2執行,t2執行完成後t3執行?

用 Thread 類的 join 方法。

private static void threadJoinOneByOne() throws InterruptedException {
      Thread t1 = new Thread(ThreadExecutionQuestion::action, "t1");
      Thread t2 = new Thread(ThreadExecutionQuestion::action, "t2");
      Thread t3 = new Thread(ThreadExecutionQuestion::action, "t3");

      // start() 僅是通知線程啓動
      t1.start();
      // join() 控制線程必須執行完成
      t1.join();

      t2.start();
      t2.join();

      t3.start();
      t3.join();
  }

  private static void action() {
      System.out.printf("線程[%s] 正在執行...\n", Thread.currentThread().getName());  // 2
  }
}

CountDownLatch也可以實現

調整優先級並不能保證控制線程執行順序

&和&&的區別?

電路問題總結:

&:不管怎樣,都會執行"&"符號左右兩邊的程序

&&:只有當符號"&&“左邊程序爲真(true)後,纔會執行符號”&&"右邊的程序。

運算規則:

&:只要左右兩邊有一個爲false,則爲false;只有全部都爲true的時候,結果爲true

&&:只要符號左邊爲false,則結果爲false;當左邊爲true,同時右邊也爲true,則結果爲true

sql語句selectgroup byorder bywhere先後順序?

寫的順序:select … from… where… group by… having… order by…

執行順序:from… where…group by… having… select … order by…

解釋Java內存模型?

Java內存模型(JMM)總結

JDBC如何連接數據庫?

JDBC【介紹JDBC、使用JDBC連接數據庫、簡單的工具類】

兩位技術負責人+部長(周)簡單聊了一下,自己的項目和經驗,遇到過哪些問題?怎麼解決的?怎麼設計數據庫模型?

浩鯨科技

一面

自我介紹

談一下自己最熟悉的項目中的業務框架?

(登錄+權限VIP服務綁定)

開發過程中後端如何提交給前端接口?

如何解決前後端token過期問題?

每隔一段時間在後端請求中都將token傳送過去,獲取新的token值,並返回前端放入cookies中並記錄cookie的存儲失控,達到更新cookie中token的效果;而長時間不做操作的話我們就可以讓他的token失效退出系統了。

如何解決前後端token過期問題

如何實現在登錄中高可用?什麼是高可用?

用戶信息存redis;加節點,加機器,多部署實例。

什麼是高可用

你實際java開發多長時間?

當問我這個問題的時候,我就知道前面答得並不是很好,所以面試官後面問的都是基礎題。

抽象類和接口有什麼區別?

接口和抽象類有什麼區別?

用過哪些集合?list和set的區別?

深入理解Java中的List、Set與Map集合

用過哪些設計模式?

如何在代碼中應用設計模式

你這邊還有什麼問題?

因爲這個項目是和杭州阿里系的大佬們一起開發盒馬鮮生這款產品,所以着重問了下開發產品情況和團隊架構。

你現在的薪資和期望薪資?

照實際的說,大廠一般都會查銀行流水。

二面

整理中

杏仁醫生

一面

自我介紹

mysql 常用存儲引擎有哪些?分別有什麼特點和區別?

MySQL常用存儲引擎

談一談MySQL的四種事務隔離級別,有哪些區別?

MySQL的四種事務隔離級別

說一下非公平鎖?平時用到的是非公平鎖多一點還是公平鎖多一點?

非公平鎖的優點是可以減少喚起線程的開銷,整體的吞吐效率高,因爲線程有機率不阻塞直接獲得鎖,CPU不必喚醒所有線程。缺點是處於等待隊列中的線程可能會餓死,或者等很久纔會獲得鎖。

談一下volatile關鍵字你是怎麼理解的?能否保證原子性?(比較synchronized關鍵字)

volatile關鍵字是線程同步的輕量級實現,所以volatile性能肯定比synchronized關鍵字要好。但是volatile關鍵字只能用於變量,而synchronized關鍵字可以修飾方法以及代碼塊。synchronized關鍵字在JavaSE1.6之後進行了優化,主要包括爲了減少獲得鎖和釋放鎖帶來的性能消耗而引入的偏向鎖和輕量級鎖以及其它各種優化,執行效率有了顯著提升,實際開發中使 用 synchronized 關鍵字的場景還是更多一些。

多線程訪問volatile關鍵字不會發生阻塞,而synchronized關鍵字可能會發生阻塞。

volatile關鍵字能保證數據的可見性,但不能保證數據的原子性。synchronized關鍵字兩者都能保證。

volatile關鍵字主要用於解決變量在多個線程之間的可見性,而 synchronized關鍵字解決的是多個線程之間訪問資源的同步性。

談一下樂觀鎖和悲觀鎖?

面試必備之樂觀鎖與悲觀鎖

面試官:什麼是樂觀鎖請舉例 程序員:瑟瑟發抖 不懂啊

談一下守護線程?用到過哪種?

java 多線程 守護線程

ArrayList和LinkedList的區別?

Java中ArrayList和LinkedList區別

簡單介紹下java中常見的引用類型

java基本類型與引用類型

興盛優先

說下面試前奏,我和這個公司互相鴿了一次,第一次我是因爲那次在地鐵裏,信號不好怕影響面試效果,就提前說明了;結果第二次本來約的是晚上8:00,結果9:15分打電話過來面試,fuck,我還在洗衣服。面試官說只要20分鐘,如果不方便可以下次約,好像這個面試官是已經下班了,在家裏跟我打得電話,我覺得都不容易,還是同意面了。

說來也奇怪,竟然沒讓我自我介紹,直接上來就跟我聊參與的開源項目 Dubbo,問我爲這個項目貢獻了哪一塊?我輕描淡寫的描述了主要負責 Dubbo的哪些生態,和如何管理控制版本的發佈等等。因爲我主要負責官網的迭代和維護,而Apache項目之間的溝通都是英文交流,老外喜歡用郵件列表的形式來討論,不會像國內的開源項目,任務認領的方式是在社交軟件上進行溝通,老外根本就不用。順便問了下我英語怎麼樣?我講完後,順便介紹了下我自己。接下來正式進入面試環節。

一面

談一談 Dubbo 序列化協議

Dubbo 支持 HessianJava 二進制序列化、json、SOAP 文本序列化多種序列化協議。但是 Hessian 是其默認的序列化協議。

談一下 Dubbo 的整體架構中的網絡傳輸層(Transport)?

抽象 mina 和 netty 爲統一接口,以 Message 爲中心,擴展接口爲Channel、Transporter、Client、Server和Codec

30 道 Dubbo 面試題及答案

說一下你最熟悉的項目中,遇到的印象最深刻的問題?是怎麼解決的?

Springboot與shiro整合遇到的坑

說一下在HashMap中遇到的hash衝突是如何解決的?

HashMap?面試?我是誰?我在哪

原理:HashMap基於哈希表實現的,通過put和get方法存儲和獲取對象。當調用put方法時,通過鍵對象的hashCode找到在數組中的位置來存儲值對象。當獲取對象時的時候,先通過鍵對象的hashCode找到數組中的位置,然後通過鍵對象的equals()方法找到正確的值對象。

HashMap使用LinkedList來解決碰撞衝突,當兩個對象的hashCode相等時它們在數組的位置相同就會發生碰撞衝突,這個時候對象將會存儲在LinkedList的下一個節點中。獲取對象的時候通過鍵對象的equals方法遍歷LinkedList直到找到正確的值對象。

談一下List接口有哪些特性?

深入理解Java中的List、Set與Map集合

說一下ArrayList和LinkedList區別?

Java中ArrayList和LinkedList區別

foreach循環裏進行元素的remove/add操作,這樣合理嗎?爲什麼?

不合理

爲什麼阿里巴巴禁止在 foreach 循環裏進行元素的 remove/add 操作

當有線程 T1、T2 以及 T3,如何實現 T1 -> T2 -> T3 的執行順序?以上問題請至少提供另外一種實現?

用 Thread 類的 join 方法。

private static void threadJoinOneByOne() throws InterruptedException {
      Thread t1 = new Thread(ThreadExecutionQuestion::action, "t1");
      Thread t2 = new Thread(ThreadExecutionQuestion::action, "t2");
      Thread t3 = new Thread(ThreadExecutionQuestion::action, "t3");

      // start() 僅是通知線程啓動
      t1.start();
      // join() 控制線程必須執行完成
      t1.join();

      t2.start();
      t2.join();

      t3.start();
      t3.join();
  }

  private static void action() {
      System.out.printf("線程[%s] 正在執行...\n", Thread.currentThread().getName());  // 2
  }
}

CountDownLatch也可以實現;

調整優先級並不能保證優先級高的線程先執行。

好像還有一個問題?是一個專有技術名詞的解釋?我真的沒聽過…

御泥坊

這個也是一個朋友內推,工資要砍半,細節我就不說了,直接上乾貨。

說一下你最熟悉的項目中,遇到的印象最深刻的問題?是怎麼解決的?

Springboot與shiro整合遇到的坑

說一下TCP/IP 協議

HTTP協議—— 簡單認識TCP/IP協議

如何讓Redis與Mysql數據保持同步?

如何保持mysql和redis中數據的一致性?

redis與Mysql的數據一致性

如何查詢Hashmap裏面的元素?(增刪改查)

【面向對象版】HashMap(增刪改查)

說一下Hashmap 擴容機制?第一次擴容到達的閾值是多少?

JDK 1.7: 深入理解HashMap的擴容機制

JDK 1.8: jdk1.8 HashMap工作原理和擴容機制(源碼解析)

默認大小爲16,負載因子0.75,閾值12

拓維信息

這個是Boss直聘找的,本來是另一個HR先跟我聊得,後面他出差了,來了個小姐姐找我。

一面

說一下Spring boot(工作機制,和spring mvc對比優缺點)

這10道springboot常見面試題你需要了解下

說一下Spring MVC框架

Spring MVC框架

工作中有沒有遇到過Mysql優化,請談一談

巧用這19條MySQL優化,效率至少提高3倍

最全 MySQL 優化方法,從此優化不再難

Mysql一般什麼情況查詢容易出現索引失效?怎麼解決?

關聯查詢

Mysql之索引失效

MySQL避免索引失效

說一下在工作項目中如何運用Redis的?

Redis

工作中使用Java多態多嗎?請簡單說一下

淺談java多態

淺談Java的多態

工作中用過哪些接口?其中List有哪些類?談一下它們的區別?

工作3年出去面試Java,被鄙視spring的接口有哪些都不清楚

深入理解Java中的List、Set與Map集合

有使用過Spring Cloud嗎?有了解過微服務嗎?

對前端技術有了解嗎?

你這邊有什麼問題?

陸金所

一面

看我工作時間不長,問我爲什麼頻繁跳槽(間接問離職原因)

說一下Java類加載機制?

Java類加載機制

說一下GC中 G1 G2 的算法

G1 收集器原理理解與分析

爲啥你們公司在使用Mysql,還要使用MongDB?

我爲什麼放棄MySQL?選擇了MongoDB

說一下 B+樹 的理解?

平衡二叉樹、B樹、B+樹、B*樹 理解其中一種你就都明白了

你對索引有了解嗎?說一下A =‘a’,B=‘b’, AB=‘ab’?(這個題說實話沒聽清面試官的意思,應該是問的是否會造成索引失效)。

蜜獾信息

一面

說一下最近做過的項目

你使用過哪些JDK版本?

用過哪些集合包?

ArrayList、LinkedList、Vector、Stack、HashSet、TreeSet、HashMap、TreeMap

深入理解Java中的List、Set與Map集合

說一下ArrayList、LinkedList、HashMap 底層數據結構

Arraylist 與 LinkedList 區別?

一篇文章搞定ArrayList和LinkedList所有面試問題

HashMap底層實現原理(上)

HashMap底層實現原理(下)

Arraylist 是有序還是無序?

有序

有哪些方式可以實現多線程?

Java多線程實現的四種方式

用過哪些併發包(我反問面試官是不是JUC,爲何他說不是?)

java併發包、線程池、鎖

說一下sleep( ) 和 wait( )的區別?

sleep( ) 和 wait( ) 的這 5 個區別,你知道幾個?

開發過程中遇到過哪些異常?Exception 與 error的區別?說一下error層次結構?

Java異常處理

用過哪些數據庫?說一下Mysql 四種事務隔離級別?哪種級別最高?爲什麼?

真正理解Mysql的四種事務隔離級別

用過索引吧?在使用索引需要注意什麼?(如何避免索引失效?)

如何理解並正確使用MySql索引

Mysql索引簡明教程

Mysql之索引失效

MySQL避免索引失效

說一下Spring MVC框架

Spring MVC框架

http 和 https 的區別?

http就是我們說的超文本傳輸協議,這個協議它是用一種明文的方式發送我們的內容,沒有任何的加密。比如說我們訪問一個網站,我們可能需要在這個網站輸入密碼,登錄賬號之類的操作,那我們的賬號和密碼就會發送到網站的服務器上面。但要是有人在中途截取了我們的信息,那我們的一些比較重要的信息可能就暴露了,所以爲了解決http在傳輸過程中不加密的問題,之後就增加了一個SSL協議,這個協議簡單說就是一個提供數據安全和完整性的協議,也就是負責網絡連接的加密。

比如我們訪問一個https的網站,那我們的電腦就會先和服務器建立一個安全的連接通道,然後服務器會先發送一份網站的證書信息到我們電腦,就相當於是告訴我們電腦,你訪問的服務器沒有問題。確認了信息之後,我們服務器就會生成一個加鎖的箱子,但是這把鎖有兩把不一樣的鑰匙,一把是給我們電腦的,另一把是服務器自己的。然後服務器就會把沒有上鎖的箱子和鑰匙發給我們電腦,我們把信息放在箱子裏面之後,用鑰匙鎖上,然後發給服務器,服務器再用自己的鑰匙打開箱子,來保證信息的安全。在這個過程中,即使箱子被別人攔截了,因爲沒有服務器的鑰匙,以目前的技術來講,還是很難打開箱子的。所以現在的一些大的網站,尤其是購物網站、或者是需要我們登錄的網站,基本上都是https的。

http 和 https 有何區別?如何靈活使用?

一般數據都是以什麼形式傳給前端?

json格式

前後端數據交互之前端傳值到後臺

你這邊還有什麼問題?

豐巢科技

自我介紹

看到我說的和簡歷上的沒差別,就沒讓我繼續說了

你平時是怎麼學習技術的?

有中間件開發經驗嗎?

如何搭建nacos/dubbo平臺?

說一下Spring MVC框架

Spring MVC框架

Mybatis是如何將sql執行結果封裝爲目標對象並返回的?都有哪些映射形式?

第一種是使用標籤,逐一定義列名和對象屬性名之間的映射關係。第二種是使用sql列的別名功能,將列別名書寫爲對象屬性名,比如T_NAME AS NAME,對象屬性名一般是name,小寫,但是列名不區分大小寫,Mybatis會忽略列名大小寫,智能找到與之對應對象屬性名,你甚至可以寫成T_NAME AS NaMe,Mybatis一樣可以正常工作。
有了列名與屬性名的映射關係後,Mybatis通過反射創建對象,同時使用反射給對象的屬性逐一賦值並返回,那些找不到映射關係的屬性,是無法完成賦值的。

十道常見的mybatis面試題

談一談公平鎖和非公平鎖?

最全Java鎖詳解:獨享鎖/共享鎖+公平鎖/非公平鎖+樂觀鎖/悲觀鎖

兩程序員玩“鎖”,一人搶救無效身亡

簡單聊下線程池?

線程池你真不來了解一下嗎?

當面試官問線程池時,你應該知道些什麼?

簡單說一下Java內存模型(JMM)

Java內存模型(JMM)總結

工作中有沒有Mysql優化的經驗,請談一談

巧用這19條MySQL優化,效率至少提高3倍

最全 MySQL 優化方法,從此優化不再難

談一下索引數據結構

數據庫索引數據結構總結

簡述 B+Tree

二叉樹學習筆記之B樹、B+樹、B*樹

談一談單鏈表和雙鏈表的區別?

單鏈表:單鏈表只有一個指向下一節點的指針,也就是隻能next。

雙鏈表:雙鏈表除了有一個指向下一節點的指針外,還有一個指向前一結點的指針,可以通過prev快速找到前一結點。一般我們都構造雙向循環鏈表。

數據結構與算法-鏈表(上)

談談 synchronized 和 ReentrantLock 的區別

  • 兩者都是可重入鎖
  • synchronized 依賴於 JVM 而 ReentrantLock 依賴於 API
  • ReentrantLock 比 synchronized 增加了一些高級功能

相比synchronized,ReentrantLock增加了一些高級功能。主要來說主要有三點:①等待可中斷;②可實現公平鎖;③可實現選擇性通知(鎖可以綁定多個條件)

  • 兩者的性能已經相差無幾

談談 synchronized 和 ReentrantLock 的區別

思愛普

一面

String 和 StringBuilder 有何異同?

JAVA中String與StringBuffer,StringBuilder的區別

開發完後一般用什麼測試工具測試?還是有人測試?

說說Java單元測試

JAVA 程序員需要用到 10 個測試框架和庫

比較 checked exception 與 unchecked exception

Java異常:選擇Checked Exception還是Unchecked Exception?

ClassNotFoundException 和 NoClassDefFoundErr區別?

ClassNotFoundException和NoClassDefFoundError的區別

談一下 Threadlocal 和 ThreadLocalMap

深度揭祕ThreadLocal

ThreadLocal-面試必問深度解析

說一下 Mysql 中的 JOIN

圖解 SQL 裏的各種 JOIN

說一下 Mysql 中的事物隔離級別

MySQL的四種事務隔離級別

互聯網項目中mysql應該選什麼事務隔離級別

MongDB 中有哪些事物隔離級別?

MongoDB是如何實現事務的ACID?

如何保持 Mysql 和 redis中數據的一致性?

如何保持mysql和redis中數據的一致性?

說一下 redis 運用場景

Redis常見的應用場景解析

Mysql 有哪些優化方式?

巧用這19條MySQL優化,效率至少提高3倍

最全 MySQL 優化方法,從此優化不再難

Mysql中除了主鍵約束(primary key),還有哪些約束?

MySQL——約束(constraint)詳解

請用英文介紹“溫爾寶貝”項目?

wener baby app

The project is for continuous monitoring of user’s body temperature, real-time temperature, prompt the user and through the cyclical temperature data analysis of the user’s health.Using Springboot + mybatis architecture, mybatis - plus to simplify the development of the dao layer, and extract the universal service;Swagger document automatically generated interface, convenient interface test;Gradle management jar package, solve the jars conflict;Use redis for middle pressure to reduce database cache.

wener baby pad

The project on the basis of previous app, joint development with offline clinics and hospitals, and VIP card binding through mobile phones, on the pad for continuous monitoring of the user’s temperature display.Springboot + mongo framework, using the swagger automatically generated interface documents, convenient interface test;Taiwan before and after data interaction using the vue to simplify the dom manipulation;Neginx reverse proxy server, the data flow, split into multiple servers to improve the whole performance of the server system.

在Win系統中如何運行.sh文件?

win10下安裝bash+運行.sh文件

房多多

自我介紹

說一下項目中登錄模塊業務

在登錄模塊中,主要負責註冊、登錄功能。在註冊模塊中,我們使用hibernate-validator依賴完成後臺POJO的校驗,可以防止用戶跳過前端的js校驗。在登錄模塊中,通過Controller,Service和Dao三層架構查詢用戶在數據庫中是否存在信息,如果存在,則通過當前時間戳及用戶id生成一個token,將token存入的redis中,然後把toekn存入到cookie中,發送給前端。

在多節點登錄的前提下,如何防止同一賬號,同時在多個不同設備登錄

WEB系統防止同一賬號,同時在多個不同設備登錄

爲什麼要用redis存儲token

1、token具有時效性,redis處理有優勢。

2、在API領域,由於請求數比較多,redis也有優勢。

3、登錄信息一般不需要長效儲存,所以可以減少DB的壓力,直接用redis。

還有其他的看項目情形來定。

談一下垃圾回收(GC 算法)

淺析JAVA的垃圾回收機制(GC)

說一下分佈式鎖

分佈式鎖看這篇就夠了

說一下分佈式事物以及應用場景

分佈式事務?No, 最終一致性

工作中有用到過冪等嗎?簡單說一下

分佈式高併發系統如何保證對外接口的冪等性?

什麼是分佈式系統中的冪等性

你這邊還有什麼問題?

戴爾易安信

解釋下 final 關鍵字

final,static,this,super 關鍵字總結

Volatile 和 Synchronized 的區別?

volatile和synchronized的區別

如何設計 RESTful API?說一下冪等性?HTTP常用方法接觸過哪些?分別是幹什麼的?

RESTful API最佳實踐

如何更好的設計RESTful API

說一下用過哪些排序算法?

九種排序算法的可視化及比較

Mysql事務的基本要素(ACID)?一致性的業務場景?數據庫中如何做到一致性?事務隔離級別?用例子說明不可重複讀(read-committed)

MySQL的四種事務隔離級別

進程和線程的區別?

簡述線程、程序、進程的基本概念。以及他們之間關係是什麼?

圖解進程和線程的關

接觸過哪些數據庫索引數據結構?什麼是 B+Tree?

數據庫索引數據結構總結

簡單說一下數據庫中的索引?

通俗易懂 索引、單列索引、複合索引、主鍵、唯一索引、聚簇索引、非聚簇索引、唯一聚簇索引 的區別與聯繫

說一下你工作中遇到哪些內存泄露

面試題:什麼是內存泄漏?內存溢出?

談一下垃圾回收機制(GC)?垃圾回收是回收的什麼?

垃圾回收(Garbage Collection)是Java虛擬機(JVM)垃圾回收器提供的一種用於在空閒時間不定時回收無任何對象引用的對象佔據的內存空間的一種機制。

注意:垃圾回收回收的是無任何引用的對象佔據的內存空間而不是對象本身。換言之,垃圾回收只會負責釋放那些對象佔有的內存。對象是個抽象的詞,包括引用和其佔據的內存空間。當對象沒有任何引用時其佔據的內存空間隨即被收回備用,此時對象也就被銷燬。但不能說是回收對象,可以理解爲一種文字遊戲。

淺析JAVA的垃圾回收機制

如何實現多線程中的同步?

java中實現線程同步的7種方法

說一下線程同步中的讀寫鎖?

Java 種15種鎖的介紹:公平鎖,可重入鎖,獨享鎖,互斥鎖,樂觀鎖,分段鎖,自旋鎖等

java中的讀寫鎖

用英語介紹你最熟悉的項目?

wener baby (pad)

The project on the basis of previous app, joint development with offline clinics and hospitals, and VIP card binding through mobile phones, on the pad for continuous monitoring of the user’s temperature display.Springboot + mongo framework, using the swagger document automatically generated interface, convenient interface test;Taiwan before and after data interaction using the vue to simplify the dom manipulation;Neginx reverse proxy server, the data flow split into multiple server implementation, improve the performance of the entire server system.

你這邊還有什麼問題?

亞馬遜

簡歷篩選測試

Test3 :

Note: if you cannot finish the test, you may still get the chance to next step of the hiring process if some shinning points were identified from your work: if you finish the work, you may still fail because your outcome did not meet the hiring bar.
Background: we want to build a solution to hire the right people quickly. The development work of this solution is part of the solution. As a candidate, please contribute your idea and finish the assignment.
Common requirements:

  1. Use Java as the main development language unless there is a solid reason for other choice.
  2. Provide test evidence (like the snapshot of the output of your solution) to easy the reviewer.
  3. The UT coverage must > 80% if not 100%.
  4. Please try to leverage the existing functionality of this project although it’s always fine to refactor them.

Test Description: for any key words, please get the 1st non-AD search result from baidu.com.

Definition of done:

  1. Define a mechanism for the user to provide the key words.

  2. The result will be shown on a web page (you may define the URL) of this project.


爲了考覈衆多面試者的技術能力,請review一下該面試者的code:https://github.com/yingjil/JPHire/pull/6/commits/7b12ee650a15375a0b444f4374d0923e398bd02f 。他的任務是在Test3中描述的。對你的要求是用最高標準找到代碼缺陷並提出修改意見。如果接受任務,請告知估計完成時間。

備註: 這個練習只是簡歷預審覈的一步。完成任務不代表肯定能獲得面試機會(HR依然可能拒絕簡歷)。拒絕參加本任務也不會留下任何不良記錄。


個人理解

一、任務需求實現角度

1、需要定義一種提供用戶輸入搜索關鍵字的機制。我的理解是應該有一個簡單的web頁面,提供一個輸入框,一個搜索按鈕。而代碼裏這部分是缺失的。

2、搜索的結果需要展示在web頁面中。這個也沒看到對應的頁面代碼。

3、單元測試覆蓋率要達到80%以上代碼裏測試用例過於簡單,覆蓋率遠遠低於80%。

二、代碼實現角度

1、baidu.com 網站的頁面元素規則是可變的,建議“第一個非廣告搜索結果”的匹配規則設計成可配置,而不是寫死在代碼裏。

2、WebPageUtil類的職責建議設計成通用工具類,而不是耦合具體業務代碼。

3、考慮到擴展性,KeyWordSearchService應設計成接口,以支持不同搜索網站的各自實現。

有贊

hashmap 與 hashtable源碼

hashmap 在 jdk 1.7 和 jdk 1.8 中的區別

線程池,線程參數的含義

生產設置線程數的依據是什麼?

java.io.writer 有什麼方法

hashcode equals 重寫一個會有什麼情況

sleep 加鎖會釋放嗎?

緩存擊穿,雪崩

1.緩存過期導致的擊穿,如果只是單條,對系統沒有影響;如果同時一大批過期,效果就相當於雪崩,壓力都到了數據庫,扛不住。解決辦法:使得各個數據的過期時間儘量均勻,比如可以加隨機數。使得數據庫壓力均勻。

2.緩存沒命中導致的穿透,同樣的問題。這個就需要儘量以緩存爲準,即要麼通過先返回空,再異步加載數據,要麼就是用一個去重機制(bitmap 效果明顯比 boomfilter 好)。還有一個方法就是,如果數據庫裏沒有,也放一個key:null到緩存,加過期時間。

3.雪崩主要是靠高可用處理,分片、多實例、持久化,不要被清空了,宕機或重啓,預熱可以比較平穩,比如逐步加載數據。

如何保證冪等性,一般在什麼環節處理?

說說你瞭解的分佈式

愛立信

英語自我介紹

hello, everone! my name is Jiele Cao, 25 years old, from hunan, graduated from hunan university of technology, electronic information engineering in Shanghai has been working for three years after graduation, respectively in two Internet biological medical company involved in the backend development of four projects.First company Shanghai with biological technology co., LTD., work for more than a year, is mainly responsible for the company’s internal document management systems and WeChat public projects; wener recently, the Shanghai information technology co., LTD. Participated in two projects of a project which is Internet medical clinics online platform, the company is a company to do temperature detection, in the early stage of the project (wener baby), on the basis of the development on special pad, with modular service operations in the form of the project mainly includes frontend and backend, such as user, login, search module.

說一下 jdk 1.8 有哪些新特性?

jdk8, jdk8u, jdk9, jdk10的側重和區別是什麼?

JDK 9新特性彙總

JDK1.8新特性(持續更新)

線程安全?用過哪些線程安全的類?

Java集合中那些類是線程安全的

線程池?ThreadPoolExecutor 類用過哪些方法?

Java多線程-線程池ThreadPoolExecutor構造方法和規則

用過哪些JVM診斷工具?

【總結】性能調優:JVM內存診斷工具

JVM監控及診斷工具

遇到內存溢出怎麼解決?

OutOfMemoryError,當JVM因爲沒有足夠的內存來爲對象分配空間,並且垃圾回收器也已經沒有空間可回收時,就會拋出這個error(注:非exception,因爲這個問題已經嚴重到不足以被應用處理)。

因爲OutOfMemoryError是可以catch的。catch之後吞掉的話程序還能試着繼續運行。例如說以前見過的一個案例是:一個Java服務器端應用,有段代碼沒寫對導致有一個線程在瘋狂創建大數組對象——直到OOM。這個線程註冊的uncaught exception handler捕獲到了這個異常,記錄了日誌,然後就把這個異常吞掉了。這樣還能繼續正常跑下去是因爲:只是一個創建很大的數組對象的請求失敗了而已,而出錯的那個方法由於異常處理已經被退出了,程序的其它部分並沒有受影響。

JVM 發生 OOM 的 8 種原因、及解決辦法

JVM內存結構

JVM內存結構

用過哪些liunx系統的命令?如何用命令查找帶有Java內容的文件?

Linux常用命令大全

Windows CMD中查找文件和文件內容

grep -r "{關鍵字}" {路徑}

eg: grep -r "test" /data/reports

linux中如何用命令查看java進程?

ps -ef|grep java

用過Oracle嗎?MySQL 如何調優?MySQL 如何避免索引失效?

MySQL 性能調優的10個方法

索引優化:索引失效(應避免)

步步高

一面

自我介紹

溫爾寶貝 pad這個項目承擔什麼樣的角色?

MySQL 組合索引

mysql 什麼時候用單列索引?什麼使用用聯合索引?

MySQL 和 MongoDB 的區別?

MySQL與MongoDB的區別

MySQL 如何避免索引失效?

索引優化:索引失效(應避免)

假如線上項目出現問題,如何解決?

如何應對線上故障

用過哪些liunx系統的命令?查看日誌命令?

Linux 命令大全

Linux查看日誌常用命令

遇到異常怎麼處理?

Java異常處理

Object類及其常用方法

Object類及其常用方法簡介

java Object類及其常用方法

String、StringBuffer與StringBuilder的區別

String,StringBuffer與StringBuilder的區別??

"equals"和"=="的區別

equals和==的區別小結

ArrayList和LinkedList的區別?

LinkedList實現了List接口,允許null元素。此外LinkedList提供額外的get,remove,insert方法在LinkedList的首部或尾部。這些操作使LinkedList可被用作堆棧(stack),隊列(queue)或雙向隊列(deque)。

注意LinkedList沒有同步方法。如果多個線程同時訪問一個List,則必須自己實現訪問同步。一種解決方法是在創建List時構造一個同步的List:

List list = Collections.synchronizedList(new LinkedList(…));

特點:尋址困難,插入和刪除容易。

ArrayList實現了可變大小的數組。它允許所有元素,包括null。ArrayList沒有同步。

size,isEmpty,get,set方法運行時間爲常數。但是add方法開銷爲分攤的常數,添加n個元素需要O(n)的時間。其他的方法運行時間爲線性。

每個ArrayList實例都有一個容量(Capacity),即用於存儲元素的數組的大小。這個容量可隨着不斷添加新元素而自動增加,但是增長算法並沒有定義。當需要插入大量元素時,在插入前可以調用ensureCapacity方法來增加ArrayList的容量以提高插入效率。

和LinkedList一樣,ArrayList也是非同步的(unsynchronized)。

特點是:尋址容易,插入和刪除困難;

String str = new String(“abc”); 創建了幾個對象

面試題之String str = new String(“abc”); 創建了幾個對象

HashMap和Hashtable的區別

Hashtable繼承Map接口,實現一個key-value映射的哈希表。任何非空(non-null)的對象都可作爲key或者value。添加數據使用put(key,value),取出數據使用get(key),這兩個基本操作的時間開銷爲常數。

Hashtable 通過initial capacity和load factor兩個參數調整性能。通常缺省的load factor 0.75較好地實現了時間和空間的均衡。增大load factor可以節省空間但相應的查找時間將增大,這會影響像get和put這樣的操作。

作爲key的對象將通過計算其散列函數來確定與之對應的value的位置,因此任何作爲key的對象都必須實現hashCode和equals方法。

Hashtable是同步的。

HashMap和Hashtable類似,不同之處在於HashMap是非同步的,並且允許null,即null value和null key。其迭代子操作時間開銷和HashMap 的容量成比例,因此,不要將HashMap的初始化容量設得過高,或者load factor過低。

有哪些方法創建線程?

僅僅只有new thread這種方法創建線程

public class ThreadCreationQuestion {

    public static void main(String[] args) {
        // main 線程 -> 子線程
        Thread thread = new Thread(() -> {
        }, "子線程-1");

    }

    /**
     * 不鼓勵自定義(擴展) Thread
     */
    private static class MyThread extends Thread {

        /**
         * 多態的方式,覆蓋父類實現
         */
        @Override
        public void run(){
            super.run();
        }
    }

}

與運行線程方法區分:
java.lang.Runnable() 或 java.lang.Thread類

線程池的優點?如何創建一個線程池?

1)避免線程的創建和銷燬帶來的性能開銷。

2)避免大量的線程間因互相搶佔系統資源導致的阻塞現象。

3}能夠對線程進行簡單的管理並提供定時執行、間隔執行等功能。

ExecutorService pool = Executors.newCachedThreadPool(); //可根據需要創建新線程的線程池
ExecutorService pool = Executors.newSingleThreadExecutor(); //創建是一個單線程池
ExecutorService pool = Executors.newFixedThreadPool();//創建固定大小的線程池
ExecutorService pool = Executors.newScheduledThreadPool();//創建一個大小無限的線程池

線程、多線程與線程池總結

sleep() 和 wait() 的區別

sleep() 和 wait() 的區別

SpringMVC 工作原理

客戶端發送請求-> 前端控制器 DispatcherServlet 接受客戶端請求 -> 找到處理器映射 HandlerMapping 解析請求對應的 Handler-> HandlerAdapter 會根據 Handler 來調用真正的處理器開處理請求,並處理相應的業務邏輯 -> 處理器返回一個模型視圖 ModelAndView -> 視圖解析器進行解析 -> 返回一個視圖對象->前端控制器 DispatcherServlet 渲染數據(Moder)->將得到視圖對象返回給用戶

Spring 的理解

怎麼回答面試官:你對Spring的理解?

分佈式事務原理

分佈式事務:分佈式事務原理概述

如何設計接口?如何考慮接口安全性?

如何設計出一些優雅的API接口呢?

如何設計好的RESTful API之安全性

福米科技

雖然推遲了半個小時面試,但是這個面試官很耐心,等我答完後,把他的觀點闡述,面試就應該這樣,相互學習纔是面試的最高境界。

自我介紹

樂觀鎖和悲觀鎖

樂觀鎖和悲觀鎖的區別

mysql出現索引失效情況

  • 如果條件中有or,即使其中有條件帶索引也不會使用(這也是爲什麼儘量少用or的原因)。要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引。

  • 對於多列索引,不是使用的第一部分,則不會使用索引。

  • like 查詢以 % 開頭。

  • 如果列類型是字符串,那一定要在條件中將數據使用引號引用起來,否則不使用索引。

  • 如果mysql估計使用全表掃描要比使用索引快,則不使用索引。

解釋下“字符串不加單引號”是如何造成索引失效

SELECT * from staffs where name='2000';
SELECT * from staffs where name=2000;

這兩條語句都會查詢出正確結果,但第二條沒有用到索引。因爲mysql會在底層對其進行隱式的類型轉換。

查詢一張表中是否有重複數據?場景:一張表中有 id 和 name 兩個字段,查詢出 name 重複的所有數據

sql 查出一張表中重複的所有記錄數據

多線程

線程、多線程與線程池總結

如何創建的一個線程池?(非調用接口)

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory) {
    this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, 
        threadFactory, defaultHandler);
}

1)corePoolSize:線程池的核心線程數,一般情況下不管有沒有任務都會一直在線程池中一直存活,只有在 ThreadPoolExecutor 中的方法 allowCoreThreadTimeOut(boolean value) 設置爲 true 時,閒置的核心線程會存在超時機制,如果在指定時間沒有新任務來時,核心線程也會被終止,而這個時間間隔由第3個屬性 keepAliveTime 指定。

2)maximumPoolSize:線程池所能容納的最大線程數,當活動的線程數達到這個值後,後續的新任務將會被阻塞。

3)keepAliveTime:控制線程閒置時的超時時長,超過則終止該線程。一般情況下用於非核心線程,只有在 ThreadPoolExecutor 中的方法 allowCoreThreadTimeOut(boolean value) 設置爲 true時,也作用於核心線程。

4)unit:用於指定 keepAliveTime 參數的時間單位,TimeUnit 是個 enum 枚舉類型,常用的有:TimeUnit.HOURS(小時)、TimeUnit.MINUTES(分鐘)、TimeUnit.SECONDS(秒) 和 TimeUnit.MILLISECONDS(毫秒)等。

5)workQueue:線程池的任務隊列,通過線程池的 execute(Runnable command) 方法會將任務 Runnable 存儲在隊列中。

6)threadFactory:線程工廠,它是一個接口,用來爲線程池創建新線程的。

多線程阻塞?

JAVA多線程阻塞

集羣分佈式事務原理

分佈式事務:分佈式事務原理概述

併發控制鎖策略什麼情況下失效 / 爲什麼要使用分佈式鎖?

爲了保證一個方法或屬性在高併發情況下的同一時間只能被同一個線程執行,在傳統單體應用單機部署的情況下,可以使用併發處理相關的功能進行互斥控制。但是,隨着業務發展的需要,原單體單機部署的系統被演化成分佈式集羣系統後,由於分佈式系統多線程、多進程並且分佈在不同機器上,這將使原單機部署情況下的併發控制鎖策略失效,單純的應用並不能提供分佈式鎖的能力。爲了解決這個問題就需要一種跨機器的互斥機制來控制共享資源的訪問,這就是分佈式鎖要解決的問題!

實現分佈式鎖的方式

三種實現分佈式鎖的方式

volatile

volatile關鍵字是線程同步的輕量級實現,所以volatile性能肯定比synchronized關鍵字要好。但是volatile關鍵字只能用於變量,而synchronized關鍵字可以修飾方法以及代碼塊。synchronized關鍵字在JavaSE1.6之後進行了優化,主要包括爲了減少獲得鎖和釋放鎖帶來的性能消耗而引入的偏向鎖和輕量級鎖以及其它各種優化,執行效率有了顯著提升,實際開發中使 用 synchronized 關鍵字的場景還是更多一些。

多線程訪問volatile關鍵字不會發生阻塞,而synchronized關鍵字可能會發生阻塞。

volatile關鍵字能保證數據的可見性,但不能保證數據的原子性。synchronized關鍵字兩者都能保證。

volatile關鍵字主要用於解決變量在多個線程之間的可見性,而synchronized關鍵字解決的是多個線程之間訪問資源的同步性。

volatile和synchronized的區別


作者:天璇被註冊了
鏈接:https://www.imooc.com/article/286545#%E7%A6%8F%E7%B1%B3%E7%A7%91%E6%8A%80
來源:慕課網

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