日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

字节2面真题,你能答对几道?

發布時間:2023/11/25 windows 26 coder
生活随笔 收集整理的這篇文章主要介紹了 字节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 技術的使用過程是這樣的:

  1. 在執行 RDB 持久化時,Redis 進程會 fork 一個子進程來執行持久化,該過程是阻塞的。
  2. 當 fork 過程完成后,父進程會繼續接收客戶端的命令。
  3. 此時子進程與 Redis 主進程共享內存中的數據,但是子進程并不會修改內存中的數據,而是不斷的遍歷讀取并寫入數據到磁盤,也就是持久化數據的過程。
  4. 然而 Redis 主進程則不一樣,它需要響應客戶端的命令,如果收到寫入數據的操作請求,主進程就會使用 COW 機制將數據先復制再修改。
  5. 而此時,子進程使用的數據頁并不會發生任何改變,依然是 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面真题,你能答对几道?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。