1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        面試官:你能說(shuō)清楚分布式鎖,進(jìn)程鎖,線程鎖的區(qū)別嗎?

        共 3301字,需瀏覽 7分鐘

         ·

        2021-02-04 23:47

        閱讀本文大概需要 6 分鐘。

        作者:大宅洋
        www.cnblogs.com/intsmaze/p/6384105.html

        在分布式集群系統(tǒng)的開(kāi)發(fā)中,線程鎖往往并不能支持全部場(chǎng)景的使用,必須引入新的技術(shù)方案分布式鎖。

        線程鎖,進(jìn)程鎖,分布式鎖

        線程鎖:大家都不陌生,主要用來(lái)給方法、代碼塊加鎖。當(dāng)某個(gè)方法或者代碼塊使用鎖時(shí),那么在同一時(shí)刻至多僅有有一個(gè)線程在執(zhí)行該段代碼。當(dāng)有多個(gè)線程訪問(wèn)同一對(duì)象的加鎖方法/代碼塊時(shí),同一時(shí)間只有一個(gè)線程在執(zhí)行,其余線程必須要等待當(dāng)前線程執(zhí)行完之后才能執(zhí)行該代碼段。但是,其余線程是可以訪問(wèn)該對(duì)象中的非加鎖代碼塊的。
        進(jìn)程鎖:也是為了控制同一操作系統(tǒng)中多個(gè)進(jìn)程訪問(wèn)一個(gè)共享資源,只是因?yàn)槌绦虻莫?dú)立性,各個(gè)進(jìn)程是無(wú)法控制其他進(jìn)程對(duì)資源的訪問(wèn)的,但是可以使用本地系統(tǒng)的信號(hào)量控制(操作系統(tǒng)基本知識(shí))。
        分布式鎖:當(dāng)多個(gè)進(jìn)程不在同一個(gè)系統(tǒng)之中時(shí),使用分布式鎖控制多個(gè)進(jìn)程對(duì)資源的訪問(wèn)。

        分布式鎖到底是什么,怎么實(shí)現(xiàn)?

        intsmaze說(shuō)簡(jiǎn)單點(diǎn),實(shí)現(xiàn)分布式鎖必須要依靠第三方存儲(chǔ)介質(zhì)來(lái)存儲(chǔ)鎖的元數(shù)據(jù)等信息。比如分布式集群要操作某一行數(shù)據(jù)時(shí),這個(gè)數(shù)據(jù)的流水號(hào)是唯一的,那么我們就把這個(gè)流水號(hào)作為一把鎖的id,當(dāng)某進(jìn)程要操作該數(shù)據(jù)時(shí),先去第三方存儲(chǔ)介質(zhì)中看該鎖id是否存在,如果不存在,則將該鎖id寫(xiě)入,然后執(zhí)對(duì)該數(shù)據(jù)的操作;當(dāng)其他進(jìn)程要訪問(wèn)這個(gè)數(shù)據(jù)時(shí),會(huì)先到第三方存儲(chǔ)介質(zhì)中查看有沒(méi)有這個(gè)數(shù)據(jù)的鎖id,有的話就認(rèn)為這行數(shù)據(jù)目前已經(jīng)有其他進(jìn)程在使用了,就會(huì)不斷地輪詢第三方存儲(chǔ)介質(zhì)看其他進(jìn)程是否釋放掉該鎖;當(dāng)進(jìn)程操作完該數(shù)據(jù)后,該進(jìn)程就到第三方存儲(chǔ)介質(zhì)中把該鎖id刪除掉,這樣其他輪詢的進(jìn)程就能得到對(duì)該鎖的控制。
        Redis中當(dāng)然不能通過(guò)get,set操作判斷,get,set操作不是一個(gè)原子的,可以使用redis的jedis.set(String key, String value, String nxxx, String expx, int time)命令來(lái)保證原子性。
        具體實(shí)現(xiàn)方案:https://www.cnblogs.com/linjiqin/p/8003838.html
        說(shuō)了這么多,再補(bǔ)充一點(diǎn),線程鎖,進(jìn)程鎖,分布式鎖的作用都是一樣的,只是作用的范圍大小不同。范圍大小:分布式鎖——大于——進(jìn)程鎖——大于——線程鎖。能用線程鎖,進(jìn)程鎖情況下使用分布式鎖也是可以的,能用線程鎖的情況下使用進(jìn)程鎖也是可以的。只是范圍越大技術(shù)復(fù)雜度就越大。

        多年j2EE開(kāi)發(fā)生涯從未感覺(jué)到分布式鎖的痛點(diǎn)!!!

        關(guān)于分布式鎖,有過(guò)javaEE開(kāi)發(fā)經(jīng)驗(yàn)的就會(huì)說(shuō)了,系統(tǒng)為了應(yīng)對(duì)高并發(fā),會(huì)搭建一個(gè)比如tomcat集群,集群內(nèi)服務(wù)都是訪問(wèn)的同一臺(tái)數(shù)據(jù)庫(kù),有多臺(tái)服務(wù)器同時(shí)修改同一條數(shù)據(jù)庫(kù)數(shù)據(jù)的操作,但是我們并沒(méi)有在服務(wù)器中使用分布式鎖?按照上面對(duì)分布式鎖的解釋,兩個(gè)不同系統(tǒng)上的JVM進(jìn)程同時(shí)訪問(wèn)數(shù)據(jù)庫(kù)的同一個(gè)資源,這個(gè)時(shí)候我們應(yīng)該使用分布式鎖進(jìn)行控制。
        這說(shuō)的沒(méi)有錯(cuò),但是我們忘記了數(shù)據(jù)庫(kù)的特性了。如果兩臺(tái)服務(wù)器僅僅是直接訪問(wèn)(通過(guò)url)并操作某臺(tái)服務(wù)器硬盤(pán)中某個(gè)文件同一行數(shù)據(jù),這個(gè)時(shí)候我們必須用分布式鎖。
        但是因?yàn)檫@兩臺(tái)服務(wù)器訪問(wèn)的數(shù)據(jù)是存儲(chǔ)在數(shù)據(jù)庫(kù)中的(數(shù)據(jù)庫(kù)本身就是一個(gè)服務(wù)程序,多線程的接收外部系統(tǒng)發(fā)來(lái)的請(qǐng)求),兩臺(tái)服務(wù)器的請(qǐng)求通過(guò)網(wǎng)絡(luò)IO發(fā)送到數(shù)據(jù)庫(kù)服務(wù)器后,然后把請(qǐng)求交給數(shù)據(jù)庫(kù)服務(wù)的進(jìn)程處理,數(shù)據(jù)庫(kù)服務(wù)器是多線程接收請(qǐng)求并處理的,這個(gè)時(shí)候關(guān)于某表某一行數(shù)據(jù)的多線程訪問(wèn)控制是由數(shù)據(jù)庫(kù)服務(wù)進(jìn)行控制的(就是數(shù)據(jù)庫(kù)服務(wù)的代碼中進(jìn)行了線程上的加鎖處理),這就是數(shù)據(jù)庫(kù)服務(wù)器的行鎖等特性,因?yàn)閿?shù)據(jù)庫(kù)那一端已經(jīng)對(duì)外部多個(gè)系統(tǒng)的請(qǐng)求進(jìn)行了一個(gè)鎖操作,所以不需要我們?cè)趹?yīng)用服務(wù)端進(jìn)行分布式鎖的開(kāi)發(fā)。
        那如果想同時(shí)更新數(shù)據(jù)庫(kù)的多行數(shù)據(jù),這個(gè)時(shí)候數(shù)據(jù)庫(kù)的行鎖就無(wú)法保證了。這個(gè)時(shí)候我們就要使用分布式鎖,是的這個(gè)時(shí)候就可以使用,注意我用的是可以。為什么說(shuō)可以呢?因?yàn)閿?shù)據(jù)庫(kù)本身就提供了這個(gè)機(jī)制,事務(wù)以及他的隔離級(jí)別。當(dāng)然你也可以不用數(shù)據(jù)庫(kù)提供的事務(wù),用分布式鎖。

        分布式鎖的設(shè)計(jì)不需要考慮業(yè)務(wù)嗎?

        分布式鎖的設(shè)計(jì)并不是完全美好的,只能針對(duì)某些業(yè)務(wù)場(chǎng)景下使用,如果要對(duì)所有業(yè)務(wù)使用,必須充分理解業(yè)務(wù)需求合理的設(shè)計(jì),至于原因就和各位j2ee開(kāi)發(fā)時(shí)mybatis的二級(jí)緩存以命名空間為單位所要注意的業(yè)務(wù)問(wèn)題時(shí)一樣的。
        intsmaze使用分布式鎖,我們會(huì)把某表的第二第三行作為id來(lái)鎖住,如果有相同的操作時(shí)更新該表第二第三行,我們才不讓他修改,必須讓他拿到鎖才可以。但是如果有個(gè)操作僅僅是修改第二行,這個(gè)時(shí)候他就獲得了對(duì)該行的操作,而且等數(shù)據(jù)庫(kù)釋放掉之前操作對(duì)該行的鎖后。
        所以分布式鎖并不是隨處可用的,只是在某些場(chǎng)景下可以使用。比如業(yè)務(wù)系統(tǒng)不會(huì)存在單獨(dú)修改第二行的操作。

        分布式鎖用于hbase存儲(chǔ)系統(tǒng)

        實(shí)際開(kāi)發(fā)場(chǎng)景中,我們會(huì)對(duì)hbase操作進(jìn)行分布式鎖,hbase作為一款優(yōu)秀的非內(nèi)存數(shù)據(jù)庫(kù),傳統(tǒng)數(shù)據(jù)庫(kù)一樣提供了事務(wù)的概念,只是HBase的事務(wù)是行級(jí)事務(wù),可以保證行級(jí)數(shù)據(jù)的原子性、一致性、隔離性以及持久性,即通常所說(shuō)的ACID特性。
        為了實(shí)現(xiàn)事務(wù)特性,HBase采用了各種并發(fā)控制策略,包括各種鎖機(jī)制、MVCC機(jī)制等。
        因?yàn)閔base只支持行級(jí)事物,當(dāng)業(yè)務(wù)需要并發(fā)操作兩行甚至多行記錄時(shí),hbase本身就無(wú)法提供ACID的支持了。

        數(shù)據(jù)庫(kù)訪問(wèn)量過(guò)大除了主從還能如何負(fù)載壓力?

        數(shù)據(jù)庫(kù)會(huì)為客戶端的每一個(gè)請(qǐng)求創(chuàng)建一個(gè)線程,這些線程針對(duì)特定行數(shù)據(jù)修改必須獲得該行的行鎖,而其他客戶端線程要想修改該數(shù)據(jù)的話,必須等待前面的線程釋放鎖后才被允許。
        如果客戶端很多線程都要修改某行數(shù)據(jù)的話,沒(méi)有拿到鎖的線程都會(huì)在數(shù)據(jù)庫(kù)端機(jī)器上不斷輪詢,增大數(shù)據(jù)庫(kù)端的壓力。
        我們可以使用分布式鎖,把對(duì)數(shù)據(jù)庫(kù)行鎖的等待獲取的輪詢放到每一個(gè)客戶端機(jī)器上去實(shí)現(xiàn),這樣可以避免數(shù)據(jù)庫(kù)端線程的不斷輪詢。
        比如,客戶端在要發(fā)送對(duì)數(shù)據(jù)庫(kù)的某行數(shù)據(jù)的操作請(qǐng)求前,在客戶端機(jī)器上進(jìn)行鎖的爭(zhēng)搶,沒(méi)有獲取到鎖,就不會(huì)像數(shù)據(jù)庫(kù)端發(fā)送操作請(qǐng)求,這樣數(shù)據(jù)庫(kù)端就沒(méi)有了輪詢的壓力。
        當(dāng)然分布式鎖的引入一定要結(jié)合業(yè)務(wù)的需求來(lái)進(jìn)行設(shè)計(jì),不然會(huì)出現(xiàn)鎖id的命名不全導(dǎo)致讀取的數(shù)據(jù)不一致,數(shù)據(jù)過(guò)期失效等問(wèn)題。

        使用那種第三方介質(zhì)存放分布式鎖?

        目前流行的是zookeeper和redis,兩者各有好處,redis流行的內(nèi)存緩存,且能進(jìn)行水平擴(kuò)容同時(shí)還能提高請(qǐng)求負(fù)載,面對(duì)高并分布式鎖數(shù)據(jù)的讀寫(xiě)請(qǐng)求能高速響應(yīng),同時(shí)有aof,哨兵機(jī)制可以防止某臺(tái)宕機(jī)分布式鎖數(shù)據(jù)丟失帶來(lái)的問(wèn)題。
        zookeeper我是比較喜歡,因?yàn)樗欠植际揭恢滦运惴╬axos算法的實(shí)現(xiàn),面對(duì)高負(fù)載請(qǐng)求毫無(wú)壓力,同時(shí)某一臺(tái)宕機(jī)毫不影響分布式鎖數(shù)據(jù)一致性,且附帶了監(jiān)聽(tīng)機(jī)制,當(dāng)某一程序釋放某一個(gè)鎖后,其他程序可以及時(shí)得到通知來(lái)獲得對(duì)該分布式鎖的控制權(quán),這里的輪詢實(shí)現(xiàn)不需要我們?nèi)ラ_(kāi)發(fā)了。
        關(guān)于分布式鎖與線程鎖的介紹從一年前就在編輯中,一直沒(méi)有時(shí)間以一種通俗明了的方式介紹給大家。本人在很多論壇中發(fā)現(xiàn)很多剛?cè)氪髷?shù)據(jù)領(lǐng)域的新人都會(huì)提到分布式鎖,但是并沒(méi)有深刻明白分布式鎖和線程鎖的場(chǎng)景,以至于很多情況下明明線程鎖就可以搞定的卻引入了分布式鎖,讓整個(gè)系統(tǒng)設(shè)計(jì)的更加復(fù)雜了。
        另外要說(shuō)的,zookeeper筆者認(rèn)為是很棒的技術(shù),雖然在大數(shù)據(jù)領(lǐng)域只是作為某一個(gè)框架的一個(gè)協(xié)調(diào)者出現(xiàn),導(dǎo)致很多開(kāi)發(fā)者忽視了他的偉大性。但是我想說(shuō)的,在當(dāng)前火熱的微服務(wù)中,其實(shí)會(huì)借助zookeeper實(shí)現(xiàn)很多功能,比如分布式鎖,配置中心。

        推薦閱讀:

        完全整理 | 365篇高質(zhì)技術(shù)文章目錄整理

        算法之美 : 棧和隊(duì)列

        主宰這個(gè)世界的10大算法

        徹底理解cookie、session、token

        淺談什么是遞歸算法

        專注服務(wù)器后臺(tái)技術(shù)棧知識(shí)總結(jié)分享

        歡迎關(guān)注交流共同進(jìn)步

        瀏覽 26
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            少妇高潮21p | 淫色成人 | 操逼免费小视频 | 意大利做爰露性器电影电影女人城 | 亚洲黄色片网站 | 男女乱轮视频 | 99re这里只有精品在线观看 | 干比视频 | 丁香成人五月天 | 午夜欧美成人电影 |