歡迎來(lái)到培訓(xùn)無(wú)憂網(wǎng)!
咨詢熱線 400-001-5729
2022-01-07 11:10:51|已瀏覽:427次

什么是分布式鎖?在回答這個(gè)問(wèn)題之前,我們先回答一下什么是鎖。
普通的鎖,即在單機(jī)多線程環(huán)境下,當(dāng)多個(gè)線程需要訪問(wèn)同一個(gè)變量或代碼片段時(shí),被訪問(wèn)的變量或代碼片段叫做臨界區(qū)域,我們需要控制線程一個(gè)一個(gè)的順序執(zhí)行,否則會(huì)出現(xiàn)并發(fā)問(wèn)題。
如何控制呢?就是設(shè)置一個(gè)各個(gè)線程都能看的見的標(biāo)志。然后,每個(gè)線程想訪問(wèn)臨界區(qū)域時(shí),都要先查看標(biāo)志,如果標(biāo)志沒(méi)有被占用,則說(shuō)明目前沒(méi)有線程在訪問(wèn)臨界區(qū)域。如果標(biāo)志被占用了,則說(shuō)明目前有線程正在訪問(wèn)臨界區(qū)域,則當(dāng)前線程需要等待。
這個(gè)標(biāo)志,就是鎖。
在單機(jī)多線程的java程序中,我們可以使用堆內(nèi)存中的變量作為標(biāo)志,因?yàn)槎嗑程是共享堆內(nèi)存的,堆內(nèi)存中的變量對(duì)于各個(gè)線程都是可見的。
講明白了普通的鎖,接下來(lái),我們?cè)倏纯捶植际芥i。
在分布式環(huán)境下,即多臺(tái)計(jì)算機(jī),每個(gè)計(jì)算機(jī)上會(huì)啟動(dòng)jvm執(zhí)行程序的運(yùn)行環(huán)境下,如果不同計(jì)算機(jī)上的線程想訪問(wèn)臨界區(qū)域時(shí),該怎么辦呢?
前面普通鎖的使用堆內(nèi)存中的變量的方式肯定不適用了。因?yàn)樵诙鄼C(jī)環(huán)境下,某臺(tái)計(jì)算機(jī)上的堆內(nèi)存中的變量對(duì)于其他計(jì)算機(jī)上的線程肯定是不可見的。那么,根據(jù)鎖的本質(zhì)和原理,我們就要找到另外的對(duì)于多機(jī)上的線程都可見的標(biāo)志,以它來(lái)作為鎖,就可以了。這樣的鎖,就是分布式鎖。
當(dāng)然,這里只是解釋了什么是分布式鎖,至于分布式鎖該如何實(shí)現(xiàn),其實(shí)有多重方式,關(guān)鍵在于要保證鎖對(duì)多機(jī)上的程序是可見的即可。一些常用的實(shí)現(xiàn)方式是,使用redis,使用數(shù)據(jù)庫(kù)等等。
為什么要使用分布式鎖?
我們?cè)陂_發(fā)應(yīng)用的時(shí)候,如果需要對(duì)某一個(gè)共享變量進(jìn)行多線程同步訪問(wèn)的時(shí)候,可以使用我們學(xué)到的Java多線程的18般武藝進(jìn)行處理,并且可以完美的運(yùn)行,毫無(wú)Bug!
注意這是單機(jī)應(yīng)用,也就是所有的請(qǐng)求都會(huì)分配到當(dāng)前服務(wù)器的JVM內(nèi)部,然后映射為操作系統(tǒng)的線程進(jìn)行處理!而這個(gè)共享變量只是在這個(gè)JVM內(nèi)部的一塊內(nèi)存空間!
本文由培訓(xùn)無(wú)憂網(wǎng)長(zhǎng)沙牛耳教育專屬課程顧問(wèn)整理發(fā)布,希望能夠?qū)ο雲(yún)⒓娱L(zhǎng)沙Java培訓(xùn)班的學(xué)生有所幫助。更多Java培訓(xùn)課程資訊歡迎關(guān)注培訓(xùn)無(wú)憂網(wǎng)Java培訓(xùn)頻道或添加老師微信:1503333605010
注:尊重原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處和鏈接 http://m.elsolbar.com/news-id-13498.html 違者必究!部分文章來(lái)源于網(wǎng)絡(luò)由培訓(xùn)無(wú)憂網(wǎng)編輯部人員整理發(fā)布,內(nèi)容真實(shí)性請(qǐng)自行核實(shí)或聯(lián)系我們,了解更多相關(guān)資訊請(qǐng)關(guān)注java培訓(xùn)頻道查看更多,了解相關(guān)專業(yè)課程信息您可在線咨詢也可免費(fèi)申請(qǐng)?jiān)囌n。關(guān)注官方微信了解更多:150 3333 6050