欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一篇文章徹底搞懂面試中常被問的各種“鎖”

 更新時間:2019年05月07日 10:13:34   作者:深夜里的程序猿  
這篇文章主要給大家介紹了關于面試中常被問的各種“鎖”的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

前言

鎖,顧名思義就是鎖住一些資源,當只有我們拿到鑰匙的時候,才能操作鎖住的資源。在我們的Java,數(shù)據(jù)庫,還有一些分布式的環(huán)境中,總是充斥著各種各樣的鎖讓人頭疼,例如“公平鎖”、“自旋鎖”、“讀寫鎖”、“分布式鎖”等等。

其實真實的情況是,鎖并沒有那么多,很多概念只是從不同的功能特性,設計,以及鎖的狀態(tài)這些不同的側重點來說明的,因此我們可以根據(jù)不同的分類來搞明白為什么會有這些“鎖”?坐穩(wěn)扶好了,準備開車。

正文

“公平鎖”與“非公平鎖”

  • 公平鎖:指線程在等待獲取同一個鎖的時候,是嚴格按照申請鎖的時間順序來進行的,這就意味著在程序正常運作的時候,不會有線程執(zhí)行不到,而被“餓死”,但是也需要額外的機制來維護這種順序,所以效率相對于非公平鎖會差點。
  • 非公平鎖:概念跟“公平鎖”恰恰相反,隨機線程獲取鎖,相率相對高。
new ReentrantLock(); //默認非公平鎖
new ReentrantLock(true); //公平鎖

“重入鎖(遞歸鎖)”與“不可重入鎖(自旋鎖)”

這里要注意了,重入/遞歸,不可重入/自旋,雖然名字不同,但是確實是同一種鎖,只是從鎖的表現(xiàn)跟實現(xiàn)方式的角度來命名而已。

重入鎖:當一個線程獲取了A鎖以后,若后續(xù)方法運行被A鎖鎖住的話,當前線程也是可以直接進入的。

public class Demo {
 private Lock lockA;
 
 public Demo(Lock Lock) {
  this.lockA = lock;
 }
 
 public void methodA() {
  lockA.lock();
  methodB();
  lockA.unlock();
 }
 
 public void methodB() {
  lockA.lock();
  //dosm
  lockA.unlock();
 }
 }

當我們運行methodA()的時候,線程獲取了lockA,然后調(diào)用methodB()的時候發(fā)現(xiàn)也需要lockA,由于這是一個可重入鎖,所以當前線程也是可以直接進入的。在java中,synchronized跟ReetrantLock都是可重入鎖。 

不可重入鎖:以上面的代碼實例來說明,就是methodA進入methodB的時候不能直接獲取鎖,必須先調(diào)用unLock釋放鎖。才能執(zhí)行下去,那實現(xiàn)不可重入鎖有什么方式呢?那就是自旋,所以會有一個小名叫做自旋鎖。

public class SpinLock {

 private AtomicReference<Thread> sign =new AtomicReference<>();

 public void lock(){
  Thread current = Thread.currentThread();
  while(!sign .compareAndSet(null, current)){
  }
 }

 public void unlock (){
  Thread current = Thread.currentThread();
  sign .compareAndSet(current, null);
 }
}

 “悲觀鎖”與“樂觀鎖”

這兩種鎖呢,其實是一個很宏觀的分類,它不是一種具體的鎖,而是泛指看待并發(fā)的程度。

悲觀鎖:有一個“悲觀”的心態(tài),既每次取數(shù)據(jù)的時候,都會認為該數(shù)據(jù)會被修改,所以必須加一把鎖才安心。

樂觀鎖:樂觀的孩子,認為同一個數(shù)據(jù)不會發(fā)生并發(fā)操作的行為,所以取的時候不會加鎖,只有在更新的時候,會通過例如版本號之類的來判斷是否數(shù)據(jù)被修改了。

Java中各種鎖其實都是悲觀鎖的實現(xiàn),既操作的數(shù)據(jù)的都會被獲取鎖的線程鎖住,而樂觀鎖的話,一般是通過cas(compare and swap)的思想來實現(xiàn),例如一些原子類AtomicInteger使用自旋來原子更新。

“共享鎖”與“排他鎖”

這兩種鎖的概念比較多的出現(xiàn)在數(shù)據(jù)庫的事務當中。

共享鎖:也稱讀鎖或S鎖。如果事務對數(shù)據(jù)A加上共享鎖后,則其他事務只能對A再加共享鎖,不能加排它鎖。獲準共享鎖的事務只能讀數(shù)據(jù),不能修改數(shù)據(jù)。在java中的ReetrantReadWriteLock()也是如此。

排它鎖:也稱獨占鎖、寫鎖或X鎖。如果事務對數(shù)據(jù)A加上排它鎖后,則其他事務不能再對A加任何類型的鎖。獲得排它鎖的事務即能讀數(shù)據(jù)又能修改數(shù)據(jù)。

分布式鎖

我們上面聊的這些鎖,都是在單個程序上面的不同線程之間來實現(xiàn)的,那么當我們的不同程序需要去競爭同一塊資源的時候,這就需要分布式鎖了,我們可以通過redis、zookeeper等中間件來實現(xiàn)分布式鎖。

 對于鎖來說,其實還有偏向鎖,輕量級鎖等,但是這里涉及到的內(nèi)容就比較多,這里就不在展開篇幅介紹了,有興趣的同學可自行研究,如果你能搞懂上面介紹的這些鎖,那基本上在絕大部分的公司關于“鎖”的問題都可以迎刃而解。

總結

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

相關文章

  • java中的定時器和多線程

    java中的定時器和多線程

    這篇文章主要介紹了java中的定時器和多線程用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java控制臺輸入數(shù)組并逆序輸出的方法實例

    Java控制臺輸入數(shù)組并逆序輸出的方法實例

    這篇文章主要介紹了Java手動輸入數(shù)組并逆向輸出的方法實例,需要的朋友可以參考下。
    2017-08-08
  • kotlin之閉包案例詳解

    kotlin之閉包案例詳解

    這篇文章主要介紹了kotlin之閉包案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Java并發(fā)編程之同步容器

    Java并發(fā)編程之同步容器

    這篇文章主要介紹了Java并發(fā)編程之同步容器,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • SpringCloud網(wǎng)關(Zuul)如何給多個微服務之間傳遞共享參數(shù)

    SpringCloud網(wǎng)關(Zuul)如何給多個微服務之間傳遞共享參數(shù)

    這篇文章主要介紹了SpringCloud網(wǎng)關(Zuul)如何給多個微服務之間傳遞共享參數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Spring Boot+Mybatis+Pagehelper分頁實現(xiàn)

    Spring Boot+Mybatis+Pagehelper分頁實現(xiàn)

    本篇文章主要講述的是Spring Boot+Mybatis+Pagehelper分頁實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • 使用SpringAOP獲取用戶操作日志入庫

    使用SpringAOP獲取用戶操作日志入庫

    這篇文章主要介紹了使用SpringAOP獲取用戶操作日志入庫,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java關于String.split("|")的使用方式

    java關于String.split("|")的使用方式

    這篇文章主要介紹了java關于String.split("|")的使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Mybatis配置錯誤:java.lang.ExceptionInInitializerError

    Mybatis配置錯誤:java.lang.ExceptionInInitializerError

    這篇文章主要介紹了Mybatis配置錯誤:java.lang.ExceptionInInitializerError的相關資料,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Java?ASM使用logback日志級別動態(tài)切換方案展示

    Java?ASM使用logback日志級別動態(tài)切換方案展示

    這篇文章主要介紹了Java?ASM使用logback日志級別動態(tài)切換方案展示,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04

最新評論