我們在操作數據庫的時候,可能會由于并發問題而引起的數據的不一致性(數據沖突)。如
何保證數據并發訪問的一致性、有效性,是所有數據庫必須解決的一個問題,鎖的沖突也是
影響數據庫并發訪問性能的一個重要因素,從這一角度來說,鎖對于數據庫而言就顯得尤為
重要。
MySQL 鎖概述
相對其他數據庫而言,MySQL 的鎖機制比較簡單,其最顯著的特點是不同的存儲引擎支持
不同的鎖機制。
比如:
MyISAM 和 MEMORY 存儲引擎采用的是表級鎖(table-level locking);
InnoDB 存儲引擎既支持行級鎖( row-level locking),也支持表級鎖,但默認情況下是采
用行級鎖。
MySQL 主要的兩種鎖的特性可大致歸納如下:
阿里 P8 架構師談:MySQL 行鎖、表鎖、悲觀鎖、樂觀鎖的特點與應用
表級鎖: 開銷小,加鎖快;不會出現死鎖(因為 MyISAM 會一次性獲得 SQL 所需的全部鎖);
鎖定粒度大,發生鎖沖突的概率最高,并發度最低。
行級鎖: 開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖沖突的概率最低,并發度
也最高。
頁鎖:開銷和加鎖速度介于表鎖和行鎖之間;會出現死鎖;鎖定粒度介于表鎖和行鎖之間,
并發度一般
行鎖 和 表鎖
1.主要是針對鎖粒度劃分的,一般分為:行鎖、表鎖、庫鎖
(1)行鎖:訪問數據庫的時候,鎖定整個行數據,防止并發錯誤。
(2)表鎖:訪問數據庫的時候,鎖定整個表數據,防止并發錯誤。
2.行鎖 和 表鎖 的區別:
表鎖: 開銷小,加鎖快,不會出現死鎖;鎖定力度大,發生鎖沖突概率高,并發度最低
行鎖: 開銷大,加鎖慢,會出現死鎖;鎖定粒度小,發生鎖沖突的概率低,并發度高
悲觀鎖 和 樂觀鎖
(1)悲觀鎖:顧名思義,就是很悲觀,每次去拿數據的時候都認為別人會修改,所以每次
在拿數據的時候都會上鎖,這樣別人想拿這個數據就會 block 直到它拿到鎖。
傳統的關系型數據庫里邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都
是在做操作之前先上鎖。
(2)樂觀鎖: 顧名思義,就是很樂觀,每次去拿數據的時候都認為別人不會修改,所以不
會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本
號等機制。樂觀鎖適用于多讀的應用類型,這樣可以提高吞吐量,像數據庫如果提供類似于
write_condition 機制的其實都是提供的樂觀鎖。
(3)悲觀鎖 和 樂觀鎖的區別:
兩種鎖各有優缺點,不可認為一種好于另一種,像樂觀鎖適用于寫比較少的情況下,即沖突
真的很少發生的時候,這樣可以省去了鎖的開銷,加大了系統的整個吞吐量。但如果經常產
生沖突,上層應用會不斷的進行 retry,這樣反倒是降低了性能,所以這種情況下用悲觀鎖
就比較合適。
共享鎖
共享鎖指的就是對于多個不同的事務,對同一個資源共享同一個鎖。相當于對于同一把門,
它擁有多個鑰匙一樣。就像這樣,你家有一個大門,大門的鑰匙有好幾把,你有一把,你女
朋友有一把,你們都可能通過這把鑰匙進入你們家,這個就是所謂的共享鎖。
剛剛說了,對于悲觀鎖,一般數據庫已經實現了,共享鎖也屬于悲觀鎖的一種,那么共享鎖
在 mysql 中是通過什么命令來調用呢。通過查詢資料,了解到通過在執行語句后面加上 lock
in share mode 就代表對某些資源加上共享鎖了。
什么時候使用表鎖
對于 InnoDB 表,在絕大部分情況下都應該使用行級鎖,因為事務和行鎖往往是我們之所以
選擇 InnoDB 表的理由。但在個別特殊事務中,也可以考慮使用表級鎖。
第一種情況是:事務需要更新大部分或全部數據,表又比較大,如果使用默認的行鎖,不
僅這個事務執行效率低,而且可能造成其他事務長時間鎖等待和鎖沖突,這種情況下可以考
慮使用表鎖來提高該事務的執行速度。
第二種情況是:事務涉及多個表,比較復雜,很可能引起死鎖,造成大量事務回滾。這種
情況也可以考慮一次性鎖定事務涉及的表,從而避免死鎖、減少數據庫因事務回滾帶來的開
銷。
當然,應用中這兩種事務不能太多,否則,就應該考慮使用 MyISAM 表了。
表鎖和行鎖應用場景:
表級鎖使用與并發性不高,以查詢為主,少量更新的應用,比如小型的 web 應用;
而行級鎖適用于高并發環境下,對事務完整性要求較高的系統,如在線事務處理系統。
BAT 技術面試范圍
數據結構與算法:最常見的各種排序,最好能手寫
Java 高級:JVM 內存結構、垃圾回收器、回收算法、GC、并發編程相關(多
線程、線程池等)、NIO/BIO、各種集合類的比較優劣勢(底層數據結構也要
掌握,特別是擴容等)等。
性能優化、設計模式、UML 的掌握
Spring 框架:重點掌握(BAT 每次必問)
分布式相關:Redis 緩存、一致 Hash 算法、分布式存儲、負載均衡等。
微服務以及 Docker 容器等。






















阿里面試總結
阿里的面試特別喜歡面試技術原理,特別是
多線程
NIO
異步消息框架
分布式相關的緩存算法等
JVM 的加載過程和原理
回收算法
以及具體使用過的框架,會問部分參數檢驗你是否熟用
第一面能通過,后續被錄用的可能性就比較高了,第一輪非常重要,建議系
統性的學習面試題目!
一面:
HashMap 實現原理,ConcurrentHashMap 實現原理
紅黑樹,為什么允許局部不平衡
TCP,UDP 區別,為什么可靠和不可靠
一次 HTTP 請求的全過程,包括域名解析、定位主機等
TCP 三次握手
MySQL 事務是什么?四大特性,四大隔離級別
ConcurrentHashMap 和 Hashtable 區別
spring IOC 和 AOP,以及各有什么優點
有哪幾種常用的線程池
什么情況下使用 Runnable 和 Thread 創建線程,Runnable 和 Callable 的區別
線程方法中的異常如何處理,副線程可以捕獲到嗎
synchronized 和鎖的區別,什么情況下使用 synchronized 和 ReentrantLock
JVM 的對象分配在哪個區,Class 對象分配在哪個區
二面:
常用的設計模式介紹:單例模式、裝飾者模式等
Java 會出現內存溢出嗎?什么情況下會出現?
雙親委派模型,為什么這樣做?
對象什么情況下進入老年代?
快速排序說一下過程
AOP 實現原理:動態代理
BIO、NIO(如何實現的)、AIO
消息中間件有哪些?他們之間的優劣勢?
Redis,持久化框架
棧和隊列
垃圾回收算法
MySQL 的索引
Tomcat 類加載器
OOM 內存泄漏,什么情況下會出現,如何排查
三面:
介紹你實踐的性能優化案例,以及你的優化思路
微服務和 SOA 的區別,優劣勢
SQL 慢查詢的優化方案,索引和表的優化方案。
MySQL 與 MongoDB 的區別,海量數據的存儲
緩存框架,例如 Redis、Memcached 之間的區別,優劣勢比較
請描述一致 hash 算法
分布式 session 的共享方案有哪些,有什么優劣勢
高并發情況,系統的優化方案有哪些,以及優先級排序。
面試總結
一面:
ArrayList 和 linkedlist 區別。ArrayList 是否會越界。
ArrayList 和 hashset 有何區別。hashset 存的數是有序的么。
volatile 和 synchronized 區別
多態的原理
數據庫引擎 Innodb 和 myisam 區別
Redis 的數據結構
Redis 是基于內存的么
Redis 的 list zset 的底層實現
http 和 https 的區別,tcp 握手過程
jvm 垃圾回收算法手寫冒泡
手寫單例包括多線程下
Java 線程間怎么實現同步,notify()與 notifyAll()的區別
數據庫的悲觀鎖和樂觀鎖應用場景。
排序算法的復雜度,快速排序非遞歸實現。
海量數據過濾,黑名單過濾一個 url。
二面:
list set map 底層使用什么實現的有哪些典型實現
hashmap 擴容是怎么擴容的,為什么是 2 的冪
concurrenthashmap 為什么線程安全,采用了什么措施應對高并發
線程池的參數有什么意義
Springmvc 請求流程
Spring IOC,autowired 如何實現
Spring boot
SpringClound 的基本架構設計
Dubbo 和 SpringClound 的區別在哪里,優劣勢
說說一致性 Hash 算法
三面:
分布式架構設計哪方面比較熟悉
講講你對 CDN 的了解,與分布式緩存和本地緩存的區別
多線程和高并發有什么區別
高并發下有哪些常用的技術解決方案,舉三個高并發場景設計例子
說一個你對 JVM 優化的實際案例,包括實際步驟和方法
Docker 有使用過和了解嗎?Docker 和 JVM 的區別是什么?
Docker 的基本架構和使用場景?
負載均衡有接觸過哪些開源框架,優劣勢是什么?
數據庫分庫分表需要怎樣來實現?
數據庫端的常用優化策略?
如果讓你來設計秒殺系統,你的設計思路是什么,為什么要這樣設計?
面試總結:
java 的基礎知識點,主要圍繞在集合類和多線程等:ArrayList、LinkedList、HashSet、HashpMap的數據結果,以及如何擴容、以及 ConcurrentHashMap 相關的多線程安全等。
JVM 的內存分配、幾個常見的垃圾回收算法以及原理、還有對應的 JVM 優化參數需要牢記。
網絡:TCP 的三次握手等網絡都必問,重點掌握網絡協議。
Redis:作為分布式緩存的主力,基本也是 BAT 每次必考,重點是 Redis 的數據結構、內存、
算法、持久化,以及與別的緩存 memcached 的優劣勢。
多線程:狀態流轉、多線程的實現,以及與高并發的區別等。
Spring 框架問得是最多的,BAT 非常喜歡問,重點掌握。
最后就是分布式架構設計
常用的分布式架構設計方案:單點登錄、分布式緩存、存儲、消息的選型,還有就是數據
庫端的優化方案(需要提前了解)。
最好能提前了解深入一個類似秒殺這樣的項目,如果面試官問到類似的項目,你能把設計
思路講出來,這對你的面試結果是很大的加分項。
一面
1.自我介紹
2.談一個你覺得你學到最多的項目,使用了什么技術,挑戰在哪里3.Spring 的 bean 的作用域?(比如:singleton,prototype 等)
4.Spring 的 IOC 實現原理?沒有無參構造函數能實例化嗎?有參構造函數注入?(xml 配置)
5.通過反射,談到了方法區,然后,類加載機制?
6.synchronized 的實現原理?Volatile 能保證原子性嗎?為什么?
7.hashmap 和 concurrenthashmap 的 size 方法怎么實現的
8.JVM 的調優參數?(-Xmn,-Xms 等具體參數設置)
9.線程池優點,參數,如果我想實現 newSingleThreadPoll,應該怎么配置,構造方法傳什么
參數
10.mysql 死鎖,怎么解決,如果不要求執行順序,死鎖怎么解決
11.ioc 和 aop 原理
12.線程的五態?轉化過程?
13.TCP 三次握手,為什么三次握手?
14.JVM 內存分區?(主存,工作內存,堆,棧。。。。)
15.講一下 GC?
16.為什么要用老年代和新生代?
17.新生代進入老生代的情況?
18.新生代的分區?
二面
變著法的問了一大堆線程池的知識 (主要考對應的參數)
java 內存模型
lock 和 synchronized 的區別
reentrantlock 的實現
hashmap 和 concurrenthashmap
B+樹和 B-樹的區別
復合索引
聚集索引和非聚集索引的區別?
數據庫索引 主鍵和唯一索引有什么區別索引失效條件,什么時候該建立索引
innDB 和 MyISAM 的區別?
線程安全(阻塞同步,非阻塞同步,無同步)
三面
主要高并發和分布式架構設計
服務器模型以及之間的區別
線程池的設計
線程池如何做負載均衡
如何實現線程調度算法
復合索引是如何實現的?
如何設計單點登錄,單點登錄的原理
redis 緩存和 memcached 緩存的區別,以及各自的優劣勢
大型高并發網站如何做性能優化:Web 性能、數據庫性能、應用服務器性能等。
實踐中如何優化 MySQL:SQL 語句及索引的優化、數據庫表結構的優化、系統配置的優化、
硬件的優化
分庫分表和讀寫分離如何設計
微服務架構:dubbo 和 springcloud 的區別,以及各自對應的使用場景。
淘寶一面:
面試介紹
1)自我介紹?
2)項目介紹?
3)遇到的最大困難是什么?怎么解決的?
4)你覺得你能怎么優化這個項目?
面試題目
1)講一下 JVM
2)講一下 JVM 的分代回收以及具體算法
3)將一下 JVM 的垃圾收集器,G1 和 CMS 有啥區別?
4)講一下一個變量從產生到結束所經歷的過程,講一下字符串常量的過程?
5)將一下線程安全問題產生的原因?
6)講一下樂觀鎖和悲觀鎖7)樂觀鎖是怎么保證一致性的
8)Integer 和 int 有啥區別,integer 中有哪些特殊的函數?
9)講一下數據庫的隔離等級
10)說一下 MVCC
11)說一聚簇索引和非聚簇索引的有什么不同
淘寶二面:
1、問了冒泡排序,快排,和歸并排序及優缺點和優化
2,網絡方面有 osi 七層,tcp/ip 五層,分別有哪些協議及作用
3,爬蟲用的什么數據結構
4、tcp 的流量控制和擁塞控制
5,mysql 用的什么存儲引擎,這個存儲引擎用的什么數據結構 ,有哪些優缺點,怎么使用
6,jvm 的垃圾回收機制和垃圾收集器
7、spring 當中事物的隔離級別
8、jdk1.8 concurrenthashmap 的新的特性,有沒有看過源碼
9、 threadlocal 了解嗎
10,問了 redis 的一些問題,項目中有(擴容,失效 key 清理策略等)
11,剩下的都是項目的東西(kafka filebeat elk 原理,主從選舉,復制等)
12,后面擴展的問了一些大數據相關的,問我一些大數據處理框架是否有了解
整個過程四十分鐘左右
淘寶三面
主要項目,你做過哪些項目,用過哪些技術?了解哪些框架?你覺得對你技術提升最高的是
哪一件事情,提升了你哪一方面的技術?
1)講一下 Spring AOP 和 IOC 的底層實現
2)說一下 hashcode 的作用?HashMap 的底層實現?HashMap 和 HashTable 的區別3)說一下 concurrentHashMap 和 hashTable 在性能上的區別?以及這種差異形成的原因
4)講一下堆以及堆排序
5)說一下 B+tree 和二叉搜索樹的區別?說一下二叉搜索樹和 AVL 樹、紅黑樹之間的差別
6)給你兩個文件(字符串形式的)如何找出他們之間的不同地方?
7)你剛剛說的能怎么優化?
淘寶四面 交叉面
本來以為三面結束就是 hr 面了,又收到一面交叉面
1. 給你 50 億行字符串,機器 4G 內存(只能一臺機器),找出重復次數最多的那行字符串?
(以行為單位,每行不超過 10 個字符)
2.設計一個算法,實現兩個 10g 大文件在 10m 的內存中將兩個大文件中重復的放進第三個
文件
3. 快速排序的平均復雜多少?最壞情況是什么?(這個題估計就是緩和一下尷尬的氣氛)
支付寶一面
4. 介紹一下自己。
5. 項目參與的核心設計有哪些
6. ArrayList 和 LinkedList 底層
7. HashMap 及線程安全的 ConcurrentHashMap,以及各自優劣勢
8. Java 如何實現線程安全
9. Synchronized 和 Lock 哪個更好?
10. HashMap 中的 get()方法是如何實現的?
11. HashMap 可以用在哪些場景?
12. JVM,垃圾回收機制,內存劃分等
13. SQL 優化,常用的索引?
14. 還有什么問題需要問的。
15. 支付寶二面
16. 沒有自我介紹,直接問做過哪些 Java 開發相關的項目。
17. 對哪些技術比較熟悉?
18. 多線程狀態圖,狀態如何流轉?
19. 死鎖,死鎖原因
20. 頁鎖、樂觀鎖、悲觀鎖?
21. 樂觀鎖如何保證線程安全?
22. 用過線程池嗎,對應的好處,如何用?
23. 兩個 10G 的文件,里面是一些 url,內存只有 1G,如何將這兩個文件合并,找到相同
的 url?
24. 1000 個多并發線程,10 臺機器,每臺機器 4 核的,設計線程池大小。25. 代碼題:兩個有序數組,數組中存在重復數字,合并成一個有序數組,去除重復數字。
26. 說一下自己的優點。
27. 支付寶三面
28. jvm 性能調優都做了什么
29. 數據庫性能調優如何做
30. 分布式系統原理:CAP,最終一致性,冪等操作等
31. 高并發情況下,我們系統是如何支撐大量的請求的
32. 集群如何同步會話狀態
33. 常用 NOSQL,有做過比較?
34. 什么情況會出現雪崩,以及如何應對?
35. 負載均衡的原理
36. 數據庫事務屬性
以上就是完整的阿里技術面試題目、以及阿里面試經驗總結,希望對你有所幫助!
面試答案!
面試答案整理出來了,這次技術面試針對的崗位是阿里P8,各位可以比較一下!


版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。