我的遇到的面試題總結

面試遇到的問題,按時間順序排列:

ActiveMQ原理html

這篇文章:http://www.javashuo.com/article/p-tllnemff-cp.htmljava

 ActiveMQ 主從數據複製mysql

死鎖web

死鎖條件:面試

1.互斥條件:進程對於所分配到的資源具備排它性,即一個資源只能被一個進程佔用,直到被該進程釋放 
2.請求和保持條件:一個進程因請求被佔用資源而發生阻塞時,對已得到的資源保持不放。 
3.不剝奪條件:任何一個資源在沒被該進程釋放以前,任何其餘進程都沒法對他剝奪佔用 
4.循環等待條件:當發生死鎖時,所等待的進程一定會造成一個環路(相似於死循環),形成永久阻塞。redis

怎麼防止死鎖:算法

1.儘可能採用tryLock(timeout)的方法,能夠設置超時時間,這樣超時以後,就能夠主動退出,防止死鎖(關鍵)spring

2.減小同步代碼塊嵌套操做sql

3.下降鎖的使用粒度,不要幾個功能共用一把鎖數據庫

 

 

怎麼查看生產堆棧信息 JDK提供了什麼工具

jps -lvm 用於查看當前機器上運行的java進程。

咱們使用 jstack -l pid查看咱們的應用堆棧信息,同時能夠看到死鎖信息。

 

Redis主從怎麼複製數據:

這篇文章:http://www.javashuo.com/article/p-prxiidta-ca.html

 

遊標是用來幹什麼的?

遊標(Cursor)是處理數據的一種方法,爲了查看或者處理結果集中的數據,遊標提供了在結果集中一次一行或者多行前進或向後瀏覽數據的能力。

 

彙集索引和非彙集索引

彙集索引和非彙集索引的根本區別是表記錄的排列順序和與索引的排列順序是否一致,彙集索引表記錄的排列順序與索引的排列順序一致,優勢是查詢速度快,由於一旦具備第一個索引值的紀錄被找到,具備連續索引值的記錄也必定物理的緊跟其後。彙集索引的缺點是對錶進行修改速度較慢,這是爲了保持表中的記錄的物理順序與索引的順序一致,而把記錄插入到數據頁的相應位置,必須在數據頁中進行數據重排,下降了執行速度。建議使用匯集索引的場合爲:
  a.此列包含有限數目的不一樣值;
  b.查詢的結果返回一個區間的值;
  c.查詢的結果返回某值相同的大量結果集。

非彙集索引指定了表中記錄的邏輯順序,但記錄的物理順序和索引的順序不一致
,彙集索引和非彙集索引都採用了B+樹的結構,但非彙集索引的葉子層並不與實際的
數據頁相重疊,而採用葉子層包含一個指向表中的記錄在數據頁中的指針的方式。非
彙集索引比彙集索引層次多,添加記錄不會引發數據順序的重組。建議使用非彙集索
引的場合爲:
  a.此列包含了大量數目不一樣的值;
  b.查詢的結束返回的是少許的結果集;
  c.order by 子句中使用了該列。

 

線程阻塞

這篇文章:http://www.javashuo.com/article/p-ocbghzvr-hw.html

隊列,阻塞對列

HashMap爲何要用紅黑樹

紅黑樹的查詢性能略微遜色於AVL樹,由於其比AVL樹會稍微不平衡最多一層,也就是說紅黑樹的查詢性能只比相同內容的AVL樹最多多一次比較,可是,紅黑樹在插入和刪除上優於AVL樹,AVL樹每次插入刪除會進行大量的平衡度計算,而紅黑樹爲了維持紅黑性質所作的紅黑變換和旋轉的開銷,相較於AVL樹爲了維持平衡的開銷要小得多

https://www.jianshu.com/p/37436ed14cc6

concurrentHashMap 7和8的區別

從JDK1.7版本的ReentrantLock+Segment+HashEntry,到JDK1.8版本中synchronized+CAS+HashEntry+紅黑樹。

1.數據結構:取消了Segment分段鎖的數據結構,取而代之的是數組+鏈表+紅黑樹的結構。
2.保證線程安全機制:JDK1.7採用segment的分段鎖機制實現線程安全,其中segment繼承自ReentrantLock。JDK1.8採用CAS+Synchronized保證線程安全。
3.鎖的粒度:原來是對須要進行數據操做的Segment加鎖,現調整爲對每一個數組元素加鎖(Node)。
4.鏈表轉化爲紅黑樹:定位結點的hash算法簡化會帶來弊端,Hash衝突加重,所以在鏈表節點數量大於8時,會將鏈表轉化爲紅黑樹進行存儲。
5.查詢時間複雜度:從原來的遍歷鏈表O(n),變成遍歷紅黑樹O(logN)。

http://www.javashuo.com/article/p-uytrakmr-bo.html

CAS併發包的應用

Oracle事務

惟一索引和主鍵索引的區別

一 主鍵和惟一索引都要求值惟一,可是它們仍是有區別的:

①.主鍵是一種約束,惟一索引是一種索引;
②.一張表只能有一個主鍵,但能夠建立多個惟一索引;
③.主鍵建立後必定包含一個惟一索引,惟一索引並必定是主鍵;
④.主鍵不能爲null,惟一索引能夠爲null;
⑤.主鍵能夠作爲外鍵,惟一索引不行;

二 主鍵約束比惟一索引約束嚴格,當沒有設定主鍵時,非空惟一索引自動稱爲主鍵。對於主鍵和惟一索引的一些區別主要以下:
1.主鍵不容許空值,惟一索引容許空值
2.主鍵只容許一個,惟一索引容許多個
3.主鍵產生惟一的彙集索引,惟一索引產生惟一的非彙集索引

注:彙集索引肯定表中數據的物理順序,因此是主鍵是惟一的(彙集就是整理數據的意思)

聯合索引有什麼要注意的地方

1.單個索引須要注意的事項,組合索引所有通用。好比索引列不要參與計算啊、or的兩側要麼都索引列,要麼都不是索引列啊、模糊匹配的時候%不要在頭部啦等等
2.最左匹配原則。(A,B,C) 這樣3列,mysql會首先匹配A,而後再B,C.
3.若是用(B,C)這樣的數據來檢索的話,就會找不到A使得索引失效。若是使用(A,C)這樣的數據來檢索的話,就會先找到全部A的值而後匹配C,此時聯合索引是失效的。
把最經常使用的,篩選數據最多的字段放在左側。

https://blog.csdn.net/nakiri_arisu/article/details/79702461

Spring 事務

spring事務:

什麼是事務:
事務邏輯上的一組操做,組成這組操做的各個邏輯單元,要麼一塊兒成功,要麼一塊兒失敗.
 
事務特性ACID(4種):
原子性 (atomicity):強調事務的不可分割.
一致性 (consistency):事務的執行的先後數據的完整性保持一致.
隔離性 (isolation):一個事務執行的過程當中,不該該受到其餘事務的干擾
持久性(durability) :事務一旦結束,數據就持久到數據庫
 
若是不考慮隔離性引起安全性問題:
髒讀  :一個事務讀到了另外一個事務的未提交的數據
不可重複讀 :一個事務讀到了另外一個事務已經提交的 update 的數據致使屢次查詢結果不一致.
虛幻讀 :一個事務讀到了另外一個事務已經提交的 insert 的數據致使屢次查詢結果不一致.
 
解決讀問題: 設置事務隔離級別(5種)
  DEFAULT 這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別.
未提交讀(read uncommited)  :髒讀,不可重複讀,虛讀都有可能發生
已提交讀  (read commited):避免髒讀。可是不可重複讀和虛讀有可能發生
可重複讀 (repeatable read) :避免髒讀和不可重複讀.可是虛讀有可能發生.
串行化的 (serializable) :避免以上全部讀問題.
Mysql 默認:可重複讀
Oracle 默認:讀已提交
 

 

read uncommited:是最低的事務隔離級別,它容許另一個事務能夠看到這個事務未提交的數據。
read commited:保證一個事物提交後才能被另一個事務讀取。另一個事務不能讀取該事物未提交的數據。
repeatable read:這種事務隔離級別能夠防止髒讀,不可重複讀。可是可能會出現幻象讀。它除了保證一個事務不能被另一個事務讀取未提交的數據以外還避免瞭如下狀況產生(不可重複讀)。
serializable:這是花費最高代價但最可靠的事務隔離級別。事務被處理爲順序執行。除了防止髒讀,不可重複讀以外,還避免了幻象讀(避免三種)。
事務的傳播行爲
PROPAGION_XXX  :事務的傳播行爲
* 保證同一個事務中
PROPAGATION_REQUIRED 支持當前事務,若是不存在 就新建一個(默認)
PROPAGATION_SUPPORTS 支持當前事務,若是不存在,就不使用事務
PROPAGATION_MANDATORY  支持當前事務,若是不存在,拋出異常
* 保證沒有在同一個事務中
PROPAGATION_REQUIRES_NEW  若是有事務存在,掛起當前事務,建立一個新的事務
PROPAGATION_NOT_SUPPORTED  以非事務方式運行,若是有事務存在,掛起當前事務
PROPAGATION_NEVER 以非事務方式運行,若是有事務存在,拋出異常
PROPAGATION_NESTED 若是當前事務存在,則嵌套事務執行

 

JVM線程進來怎麼分配內存

指令重排序:

兩個String相加,編譯後是怎樣的:

兩個字符串相加底層會生成StringBuilder對象,而後使用append來拼接,若是不在循環中使用,能夠不用StringBuilder,

Volatile關鍵字

關鍵字volatile能夠用來修飾字段,就是告知程序任何對該變量的訪問均須要從共享內存中獲取,而對它的改變必須同步刷新回共享內存,它能保證全部線程對變量訪問的可見性。

對volatile語義的擴展保證了volatile變量在一些狀況下不會重排序,volatile的64位變量double和long的讀取和賦值操做都是原子的。

 

synchronized關鍵字

關鍵字synchronized能夠修飾方法或者同步塊的形式來進行使用,它主要確保多個線程在同一個時刻,只能有一個線程處於方法或者同步塊中,它保證了線程對變量訪問的可見性和排他性。

 

如何設計一個秒殺系統

https://yq.aliyun.com/articles/618443


樂觀鎖和悲觀鎖

悲觀鎖(Pessimistic Lock), 顧名思義,就是很悲觀,每次去拿數據的時候都認爲別人會修改,因此每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會block直到它拿到鎖。傳統的關係型數據庫裏邊就用到了不少這種鎖機制,好比行鎖,表鎖等,讀鎖,寫鎖等,都是在作操做以前先上鎖。

樂觀鎖(Optimistic Lock), 顧名思義,就是很樂觀,每次去拿數據的時候都認爲別人不會修改,因此不會上鎖,可是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可使用版本號等機制。樂觀鎖適用於多讀的應用類型,這樣能夠提升吞吐量,像數據庫若是提供相似於write_condition機制的其實都是提供的樂觀鎖。


分佈式鎖是怎樣

一、基於數據庫

二、基於redis或者memcached

三、基於Zookeeper


分佈式事務是怎樣

Spring 切面的五種類型的通知

before  after  afterReturning  afterThrowing around

Spring 經過IOC實現鬆散耦合

MyBatis緩存

mybatis的查詢緩存分爲一級緩存和二級緩存,一級緩存是SqlSession級別的緩存,二級緩存時mapper級別的緩存,二級緩存是多個SqlSession共享的。mybatis經過緩存機制減輕數據壓力,提升數據庫性能。

#{}和${}的區別是什麼?
#{}是預編譯處理,${}是字符串替換。
Mybatis在處理#{}時,會將sql中的#{}替換爲?號,調用PreparedStatement的set方法來賦值;
Mybatis在處理${}時,就是把${}替換成變量的值。
使用#{}能夠有效的防止SQL注入,提升系統安全性。
 
MyBatis的原理
 
某文件組外成員的權限爲只讀;全部者有所有權限;組內的權限爲讀與寫。則該文件的權限爲:-rwxrw-r-- (7+6+4=764)

 TCP三次握手四次揮手

http://www.javashuo.com/article/p-pbijuuwh-de.html

SpringMVC工做過程

1.spring mvc全部的請求都提交給DispatcherServlet,它會委託應用系統的其餘模塊負責對請求進行真正的處理工做。 

2.DispatcherServlet查詢一個或多個HandlerMapping,找處處理請求的Controller.

3.DispatcherServlet請請求提交到目標Controller

4.Controller進行業務邏輯處理後,會返回一個ModelAndView

5.Dispathcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象 

6.視圖對象負責渲染返回給客戶端。 

CopyOnWriteArrayList介紹下

CopyOnWrite容器即寫時複製的容器。通俗的理解是當咱們往一個容器添加元素的時候,不直接往當前容器添加,而是先將當前容器進行Copy,複製出一個新的容器,而後新的容器裏添加元素,添加完元素以後,再將原容器的引用指向新的容器。這樣作的好處是咱們能夠對CopyOnWrite容器進行併發的讀,而不須要加鎖,由於當前容器不會添加任何元素。因此CopyOnWrite容器也是一種讀寫分離的思想,讀和寫不一樣的容器。

lambda表達式介紹下

「Lambda 表達式」(lambda expression)是一個匿名函數,Lambda表達式基於數學中的λ演算得名,直接對應於其中的lambda抽象(lambda abstraction),是一個匿名函數,即沒有函數名的函數。Lambda表達式能夠表示閉包(注意和數學傳統意義上的不一樣)。

steam跟list的循環有什麼區別

ReentrantLock介紹下

如何不讓一個線程一直等待獲取鎖

負載均衡的原理

一、輪詢(默認)
每一個請求按時間順序逐一分配到不一樣的後端服務器,若是後端服務器down掉,能自動剔除。
upstream backserver {
server 192.168.0.14;
server 192.168.0.15;
} 二、指定權重
指定輪詢概率,weight和訪問比率成正比,用於後端服務器性能不均的狀況。
upstream backserver {
server 192.168.0.14 weight=8;
server 192.168.0.15 weight=10;
} 三、IP綁定 ip_hash
每一個請求按訪問ip的hash結果分配,這樣每一個訪客固定訪問一個後端服務器,能夠解決session的問題。
upstream backserver {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
} 四、fair(第三方)
按後端服務器的響應時間來分配請求,響應時間短的優先分配。
upstream backserver {
server server1;
server server2;
fair;
} 五、url_hash(第三方)
按訪問url的hash結果來分配請求,使每一個url定向到同一個後端服務器,後端服務器爲緩存時比較有效。
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
在須要使用負載均衡的server中增長
proxy_pass http://backserver/;
upstream backserver{
ip_hash;
server 127.0.0.1:9090 down; (down 表示當前的server暫時不參與負載)
server 127.0.0.1:8080 weight=2; (weight 默認爲1.weight越大,負載的權重就越大)
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup; (其它全部的非backup機器down或者忙的時候,請求backup機器)
}
max_fails :容許請求失敗的次數默認爲1.當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤
fail_timeout:max_fails次失敗後,暫停的時間

http://www.javashuo.com/article/p-crzvlagr-dh.html

SpringBoot 啓動的時候加載些什麼?

Redis集羣?哨兵?

 哨兵(sentinel) 是一個分佈式系統,你能夠在一個架構中運行多個哨兵(sentinel) 進程,這些進程使用流言協議(gossipprotocols)來接收關於Master是否下線的信息,並使用投票協議(agreement protocols)來決定是否執行自動故障遷移,以及選擇哪一個Slave做爲新的Master。

http://www.javashuo.com/article/p-dfatojst-ba.html

Java類加載機制

http://www.javashuo.com/article/p-gdoivhqn-hz.html

http://www.javashuo.com/article/p-fhbpjqer-ha.html

Nginx原理

https://www.jianshu.com/p/6215e5d24553

http和https

select 加什麼能夠實現悲觀鎖?加 for update.

redis的數據結構?五種,String, Hash, list ,set , zset.

Spring 的BeanFactory和ApplicationContext有什麼區別?

BeanFactory:

是Spring裏面最低層的接口,提供了最簡單的容器的功能,只提供了實例化對象和拿對象的功能;

ApplicationContext:

應用上下文,繼承BeanFactory接口,它是Spring的一各更高級的容器,提供了更多的有用的功能;

1) 國際化(MessageSource)

2) 訪問資源,如URL和文件(ResourceLoader)

3) 載入多個(有繼承關係)上下文 ,使得每個上下文都專一於一個特定的層次,好比應用的web層  

4) 消息發送、響應機制(ApplicationEventPublisher)

5) AOP(攔截器)

二者裝載bean的區別

BeanFactory:

BeanFactory在啓動的時候不會去實例化Bean,中有從容器中拿Bean的時候纔會去實例化;

ApplicationContext:

ApplicationContext在啓動的時候就把全部的Bean所有實例化了。它還能夠爲Bean配置lazy-init=true來讓Bean延遲實例化; 

 hash碰撞

一般有兩類方法處理碰撞:開放尋址(Open Addressing)法和連接(Chaining)法。

常見的加密算法

SQL查詢的深分頁問題

攔截器和AOP的區別

Redis的事務操做

 

HTTPS和HTTP的區別

  HTTPS和HTTP的區別主要以下:

  一、https協議須要到ca申請證書,通常免費證書較少,於是須要必定費用。

  二、http是超文本傳輸協議,信息是明文傳輸,https則是具備安全性的ssl加密傳輸協議。

  三、http和https使用的是徹底不一樣的鏈接方式,用的端口也不同,前者是80,後者是443。

  四、http的鏈接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全

相關文章
相關標籤/搜索