天天看點

硬核!管理mysql資料庫的工具redis面試專題及答案Spring面試專題及答案高并發多線程面試專題jvm面試專題與解析

什麼是分布式鎖?在回答這個問題之前,我們先回答一下什麼是鎖。

普通的鎖,即在單機多線程環境下,當多個線程需要通路同一個變量或代碼片段時,被通路的變量或代碼片段叫做臨界區域,我們需要控制線程一個一個的順序執行,否則會出現并發問題。

如何控制呢?就是設定一個各個線程都能看的見的标志。然後,每個線程想通路臨界區域時,都要先檢視标志,如果标志沒有被占用,則說明目前沒有線程在通路臨界區域。如果标志被占用了,則說明目前有線程正在通路臨界區域,則目前線程需要等待。

這個标志,就是鎖。

在單機多線程的java程式中,我們可以使用堆記憶體中的變量作為标志,因為多線程是共享堆記憶體的,堆記憶體中的變量對于各個線程都是可見的。

講明白了普通的鎖,接下來,我們再看看分布式鎖。

在分布式環境下,即多台計算機,每個計算機上會啟動jvm執行程式的運作環境下,如果不同計算機上的線程想通路臨界區域時,該怎麼辦呢?

前面普通鎖的使用堆記憶體中的變量的方式肯定不适用了。因為在多機環境下,某台計算機上的堆記憶體中的變量對于其他計算機上的線程肯定是不可見的。那麼,根據鎖的本質和原理,我們就要找到另外的對于多機上的線程都可見的标志,以它來作為鎖,就可以了。這樣的鎖,就是分布式鎖。

當然,這裡隻是解釋了什麼是分布式鎖,至于分布式鎖該如何實作,其實有多重方式,關鍵在于要保證鎖對多機上的程式是可見的即可。一些常用的實作方式是,使用redis,使用資料庫等等。

為什麼要使用分布式鎖

我們在開發應用的時候,如果需要對某一個共享變量進行多線程同步通路的時候,可以使用我們學到的Java多線程的18般武藝進行處理,并且可以完美的運作,毫無Bug!

注意這是單機應用,也就是所有的請求都會配置設定到目前伺服器的JVM内部,然後映射為作業系統的線程進行處理!而這個共享變量隻是在這個JVM内部的一塊記憶體空間!

分布式鎖應該具備哪些條件

在分析分布式鎖的三種實作方式之前,先了解一下分布式鎖應該具備哪些條件:

  • 1、在分布式系統環境下,一個方法在同一時間隻能被一個機器的一個線程執行;
  • 2、高可用的擷取鎖與釋放鎖;
  • 3、高性能的擷取鎖與釋放鎖;
  • 4、具備可重入特性;
  • 5、具備鎖失效機制,防止死鎖;
  • 6、具備非阻塞鎖特性,即沒有擷取到鎖将直接傳回擷取鎖失敗。

分布式鎖的三種實作方式

目前幾乎很多大型網站及應用都是分布式部署的,分布式場景中的資料一緻性問題一直是一個比較重要的話題。分布式的CAP理論告訴我們“任何一個分布式系統都無法同時滿足一緻性(Consistency)、可用性(Availability)和分區容錯性(Partition tolerance),最多隻能同時滿足兩項。”是以,很多系統在設計之初就要對這三者做出取舍。在網際網路領域的絕大多數的場景中,都需要犧牲強一緻性來換取系統的高可用性,系統往往隻需要保證“最終一緻性”,隻要這個最終時間是在使用者可以接受的範圍内即可。

在很多場景中,我們為了保證資料的最終一緻性,需要很多的技術方案來支援,比如分布式事務、分布式鎖等。有的時候,我們需要保證一個方法在同一時間内隻能被同一個線程執行。

  • 基于資料庫實作分布式鎖;
  • 基于緩存(Redis等)實作分布式鎖;
  • 基于Zookeeper實作分布式鎖;

最後

給讀者們一個小福利,有需要這些資料的朋友們可以點選我,即可免費領取資料!

ActiveMQ消息中間件面試專題

  • 什麼是ActiveMQ?
  • ActiveMQ伺服器當機怎麼辦?
  • 丢消息怎麼辦?
  • 持久化消息非常慢怎麼辦?
  • 消息的不均勻消費怎麼辦?
  • 死信隊列怎麼辦?
  • ActiveMQ中的消息重發時間間隔和重發次數嗎?

ActiveMQ消息中間件面試專題解析拓展:

硬核!管理mysql資料庫的工具redis面試專題及答案Spring面試專題及答案高并發多線程面試專題jvm面試專題與解析

redis面試專題及答案

  • 支援一緻性哈希的用戶端有哪些?
  • Redis與其他key-value存儲有什麼不同?
  • Redis的記憶體占用情況怎麼樣?
  • 都有哪些辦法可以降低Redis的記憶體使用情況呢?
  • 檢視Redis使用情況及狀态資訊用什麼指令?
  • Redis的記憶體用完了會發生什麼?
  • Redis是單線程的,如何提高多核CPU的使用率?
硬核!管理mysql資料庫的工具redis面試專題及答案Spring面試專題及答案高并發多線程面試專題jvm面試專題與解析

Spring面試專題及答案

  • 談談你對 Spring 的了解
  • Spring 有哪些優點?
  • Spring 中的設計模式
  • 怎樣開啟注解裝配以及常用注解
  • 簡單介紹下 Spring bean 的生命周期

Spring面試答案解析拓展

硬核!管理mysql資料庫的工具redis面試專題及答案Spring面試專題及答案高并發多線程面試專題jvm面試專題與解析

高并發多線程面試專題

  • 現在有線程 T1、T2 和 T3。你如何確定 T2 線程在 T1 之後執行,并且 T3 線程在 T2 之後執行?
  • Java 中新的 Lock 接口相對于同步代碼塊(synchronized block)有什麼優勢?如果讓你實作一個高性能緩存,支援并發讀取和單一寫入,你如何保證資料完整性。
  • Java 中 wait 和 sleep 方法有什麼差別?
  • 如何在 Java 中實作一個阻塞隊列?
  • 如何在 Java 中編寫代碼解決生産者消費者問題?
  • 寫一段死鎖代碼。你在 Java 中如何解決死鎖?

高并發多線程面試解析與拓展

硬核!管理mysql資料庫的工具redis面試專題及答案Spring面試專題及答案高并發多線程面試專題jvm面試專題與解析

jvm面試專題與解析

  • JVM 由哪些部分組成?
  • JVM 記憶體劃分?
  • Java 的記憶體模型?
  • 引用的分類?
  • GC什麼時候開始?

JVM面試專題解析與拓展!

硬核!管理mysql資料庫的工具redis面試專題及答案Spring面試專題及答案高并發多線程面試專題jvm面試專題與解析

組成?

  • JVM 記憶體劃分?
  • Java 的記憶體模型?
  • 引用的分類?
  • GC什麼時候開始?

JVM面試專題解析與拓展!

[外鍊圖檔轉存中…(img-igUG8uSL-1625600863602)]

繼續閱讀