字节2面真题,你能答对几道?
字節跳動的面試難度,放眼整個互聯網都是“遙遙領先”!不能說有多難,就是看了都不會的哪種!當然,這句話是開玩笑的。
咱們先來看下字節二面的所有問題:
前半部分的問題比較簡單,相信大部人都能搞定(如果你搞不定,可以偷偷去看磊哥的武林秘籍:https://www.javacn.site)。本文咱們就挑兩個比較典型的問題來回答。
1.RDB 持久化會阻塞主線程嗎?
注意這個問題有坑,這個問題千萬別上來就說:“不會阻塞主線程”,這樣回答只能拿到 50 分,壓根都沒過及格線,為什么呢?
因為 RDB 持久化是有可能會阻塞主線程的,因為 RDB 持久化有以下兩種命令:
- save:同步持久化 Redis。
- bgsave:background save,后臺保存的意思,也就是后臺持久化 Redis。
默認情況下,如果不是手動執行“bgsave”命令,則會使用“save”命令來持久化 Redis,此時是會阻塞 Redis 主線程的。所以,這是一個不難,但很容易答錯的問題。
2.說一下 Copy On Write 技術?
在市面上很少有面試官問 Java 程序員 COW(Copy On Write,寫時復制)技術的,當然能回答上來的人也不多,那咱們就來看看什么是 COW?
Copy On Write(寫時復制)是一種延遲復制的技術,用于在多個線程(或進程)之間共享資源時減少內存復制成本的。它的基本思想是,在創建拷貝或修改資源之前,不會真正的進行復制操作(懶漢模式),而是共享同一份資源的只讀副本,直到某個線程(或進程)試圖修改資源時,才會對資源進行復制操作。 這種延遲復制的策略可以減少資源復制的開銷,一定程度提高了性能和效率。
那它的使用場景有哪些呢?咱們繼續來看。
2.1 Redis 中的 Copy On Write
單線程的 Redis 想要解決一邊響應主線程的任務,一邊持久化數據,依靠的就是 COW 技術,具體來說就是依賴系統的 fork 函數的 COW 實現的。
具體來說,COW 技術的使用過程是這樣的:
- 在執行 RDB 持久化時,Redis 進程會 fork 一個子進程來執行持久化,該過程是阻塞的。
- 當 fork 過程完成后,父進程會繼續接收客戶端的命令。
- 此時子進程與 Redis 主進程共享內存中的數據,但是子進程并不會修改內存中的數據,而是不斷的遍歷讀取并寫入數據到磁盤,也就是持久化數據的過程。
- 然而 Redis 主進程則不一樣,它需要響應客戶端的命令,如果收到寫入數據的操作請求,主進程就會使用 COW 機制將數據先復制再修改。
- 而此時,子進程使用的數據頁并不會發生任何改變,依然是 fork 時的數據,繼續進行持久化。
這就是 COW 技術在 Redis 中的使用。
2.2 Java 中的 Copy On Write
Java 中使用 COW 技術實在并發容器中,這種技術的實現容器有兩個:CopyOnWriteArrayList 和 CopyOnWriteArraySet。
這兩個集合是這樣使用 COW 技術的,當有數據寫入操作時,會先復制一個新數組進行操作,等寫完之后,再將原數組的地址賦值成新數組,以 CopyOnWriteArrayList 的 add 實現為了,它的實現源碼如下:
public boolean add(E e) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
// 獲取老數組
Object[] elements = getArray();
int len = elements.length;
// 復制出新數組
Object[] newElements = Arrays.copyOf(elements, len + 1);
// 添加元素到新數組中
newElements[len] = e;
// 把原數組引用指向新數組
setArray(newElements);
return true;
} finally {
lock.unlock();
}
}
從上述代碼可以看出,在添加的時候也會使用鎖,如果不使用鎖的話,在多線程寫入時,可能會出現多個副本。
而加鎖之后,會先復制一個新數組,進行寫入操作,之后再將原數組指向新數組,整個添加操作執行完了。
當然,這兩個容器只適合多讀少寫的場景,因為每次寫入操作都要加鎖和復制新數組進行操作,這些操作的性能開銷都是很大的。
小結
都說字節的面試難,其實就難在底層知識問的多,以及有算法問題,所以想進大廠,這兩項能力都要提升,勿在浮沙筑高臺。愿好~
參考 & 鳴謝
www.cnblogs.com/chenssy/p/15142814.html
本文已收錄到我的面試小站 www.javacn.site,其中包含的內容有:Redis、JVM、并發、并發、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、設計模式、消息隊列等模塊。
總結
以上是生活随笔為你收集整理的字节2面真题,你能答对几道?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 14岁女孩身高2米26独霸篮下!网友:玩
- 下一篇: Android 输入系统介绍