<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【130期】面試官:你能說清楚分布式鎖,進程鎖,線程鎖的區(qū)別嗎?

          共 3434字,需瀏覽 7分鐘

           ·

          2021-02-03 00:08

          程序員的成長之路
          互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享?
          關(guān)注


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

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

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

          線程鎖,進程鎖,分布式鎖

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

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

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

          多年j2EE開發(fā)生涯從未感覺到分布式鎖的痛點!!!

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

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

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

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

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

          數(shù)據(jù)庫訪問量過大除了主從還能如何負載壓力?

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

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

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

          推薦閱讀:

          【129期】看完這篇,再也不怕面試被問HashMap了~

          【128期】一道搜狗面試題:IO多路復(fù)用中select、poll、epoll之間的區(qū)別

          【127期】面試官:你說使用過ZooKeeper,那來說說他的基本原理吧

          5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機,樹莓派,等等。在公眾號內(nèi)回復(fù)「2048」,即可免費獲取!!

          微信掃描二維碼,關(guān)注我的公眾號

          朕已閱?

          瀏覽 72
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人高清无码视频在线免费观看 | 男人的天堂一区 | 伊人久久免费视频 | 91 丝袜一区二区三区 | 麻豆三级片在线播放 |