最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

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

正文

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

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

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

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

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

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();
 }
 }

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

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

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);
 }
}

 “悲觀鎖”與“樂觀鎖”

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

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

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

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

“共享鎖”與“排他鎖”

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

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

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

分布式鎖

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

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

總結(jié)

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

相關(guān)文章

  • Golang Protocol Buffer案例詳解

    Golang Protocol Buffer案例詳解

    這篇文章主要介紹了Golang Protocol Buffer案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 啟動(dòng)Tomcat時(shí)出現(xiàn)大量亂碼的解決方法

    啟動(dòng)Tomcat時(shí)出現(xiàn)大量亂碼的解決方法

    今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著啟動(dòng)Tomcat時(shí)出現(xiàn)大量亂碼的解決方法展開,文中有非常詳細(xì)的介紹及圖文示例,需要的朋友可以參考下
    2021-06-06
  • SpringBoot 在項(xiàng)目啟動(dòng)之后執(zhí)行自定義方法的兩種方式小結(jié)

    SpringBoot 在項(xiàng)目啟動(dòng)之后執(zhí)行自定義方法的兩種方式小結(jié)

    這篇文章主要介紹了SpringBoot 在項(xiàng)目啟動(dòng)之后執(zhí)行自定義方法的兩種方式小結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringBoot 在測試時(shí)如何指定包的掃描范圍

    SpringBoot 在測試時(shí)如何指定包的掃描范圍

    這篇文章主要介紹了SpringBoot 在測試時(shí)如何指定包的掃描范圍,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java反射使用示例分享

    java反射使用示例分享

    這篇文章主要介紹了java反射使用示例,代碼很簡單,需要的朋友可以參考下
    2014-02-02
  • Java線程中的Thread.yield()詳細(xì)解析

    Java線程中的Thread.yield()詳細(xì)解析

    這篇文章主要介紹了Java線程中的Thread.yield()詳細(xì)解析,yield()讓當(dāng)前線程從運(yùn)行狀態(tài)?轉(zhuǎn)為?就緒狀態(tài),以允許具有相同優(yōu)先級的其他線程獲得運(yùn)行機(jī)會(huì),需要的朋友可以參考下
    2023-11-11
  • 6種SpringBoot解決跨域請求的方法整理

    6種SpringBoot解決跨域請求的方法整理

    跨域資源共享是一種標(biāo)準(zhǔn)機(jī)制,允許服務(wù)器聲明哪些源可以訪問其資源,在SpringBoot應(yīng)用中,有多種方式可以解決跨域問題,本文主要介紹了6種常見的解決方案,大家可以根據(jù)需求自行選擇
    2025-04-04
  • java  Iterator接口和LIstIterator接口分析

    java Iterator接口和LIstIterator接口分析

    這篇文章主要介紹了java Iterator接口和LIstIterator接口分析的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Java中的ThreadLocal線程池原理

    Java中的ThreadLocal線程池原理

    這篇文章主要介紹了Java中的ThreadLocal線程池原理,ThreadLocal提供了線程的局部變量(或本地變量),它可以保證訪問到的變量屬于當(dāng)前線程,每個(gè)訪問這種變量的線程(通過它的get或set方法)都有自己的、獨(dú)立初始化的變量副本,需要的朋友可以參考下
    2023-11-11
  • JAVA8如何妙用Optional解決NPE問題詳解

    JAVA8如何妙用Optional解決NPE問題詳解

    在Java中,null代表一個(gè)不存在的對象,如果對它進(jìn)行操作就會(huì)拋出java.lang.NullPointerException異常,下面這篇文章主要給大家介紹了關(guān)于JAVA8如何妙用Optional解決NPE問題的相關(guān)資料,需要的朋友可以參考下
    2018-06-06

最新評論

陇西县| 大同县| 玉龙| 阳信县| 萨迦县| 融水| 淮南市| 北宁市| 太保市| 保山市| 雷州市| 义乌市| 邢台县| 诸城市| 龙岩市| 乐至县| 怀安县| 长岛县| 东明县| 荥阳市| 绍兴市| 九寨沟县| 灵丘县| 桃园县| 蓝山县| 额敏县| 怀仁县| 论坛| 宁陵县| 凭祥市| 获嘉县| 崇仁县| 仙游县| 宣恩县| 新泰市| 成武县| 黔东| 措勤县| 秭归县| 邢台县| 怀远县|