一種分布式系統(tǒng)中多線程同步的方法和系統(tǒng)的制作方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)及其軟件技術(shù)領(lǐng)域,特別地涉及一種分布式系統(tǒng)中多線程同步的方法和系統(tǒng)。
【背景技術(shù)】
[0002]當(dāng)使用多個(gè)線程來訪問同一個(gè)數(shù)據(jù)時(shí),非常容易出現(xiàn)安全問題,例如:多個(gè)線程都在操作同一數(shù)據(jù)導(dǎo)致數(shù)據(jù)不一致的問題等。因此,我們需要用同步機(jī)制來解決這些問題,也就是線程同步。線程同步是指在多個(gè)線程同時(shí)訪問同一資源的時(shí)候,需要保證該資源每次只能被一個(gè)線程獨(dú)占?,F(xiàn)在主流的做法是對(duì)數(shù)據(jù)分塊,達(dá)到數(shù)據(jù)隔離。但是,有些應(yīng)用不得不利用分布式系統(tǒng)中的線程同步。
[0003]在分布式系統(tǒng)中,由于應(yīng)用程序部署在不同的機(jī)器上,而在不同機(jī)器之間,程序無法共享使用內(nèi)存信息,所以不同機(jī)器的多個(gè)線程間的同步是困難的。因此,分布式同步是程序開發(fā)的時(shí)候盡量需要避免的。
[0004]現(xiàn)有的分布式系統(tǒng)中線程同步的方法主要是,所有線程都通過指定的緩存中間件(或者數(shù)據(jù)庫)來修改指定資源記錄的占有狀態(tài),這些中間件本身是具有原子性。當(dāng)多個(gè)線程同時(shí)去修改某個(gè)資源狀態(tài)的時(shí)候,最多只有一個(gè)線程能夠修改成功。此處,修改成功的就可以被認(rèn)為是搶占資源成功。
[0005]然而,現(xiàn)有的分布式系統(tǒng)中線程同步的方法具有如下的缺陷:
[0006]1、所有線程都是通過主動(dòng)輪詢的方式來查詢是否可以訪問資源,效率低;并且當(dāng)資源被釋放后,缺少通知同步線程的機(jī)制;
[0007]2、不支持靈活自定義的多條件的線程同步,S卩:各個(gè)線程可根據(jù)自定義的條件主動(dòng)選擇阻塞或者根據(jù)自定義的條件喚醒相應(yīng)的線程。
【發(fā)明內(nèi)容】
[0008]有鑒于此,本發(fā)明提供一種分布式系統(tǒng)中多線程同步的方法和系統(tǒng),通過異步監(jiān)聽實(shí)現(xiàn)分布式系統(tǒng)中的多線程同步,能夠支持自定義條件對(duì)線程同步的靈活控制,做到線程主動(dòng)釋放資源以及精確喚醒相關(guān)等待線程,資源利用率高。
[0009]為實(shí)現(xiàn)上述目的,根據(jù)本發(fā)明的一個(gè)方面,提供了一種分布式系統(tǒng)中多線程同步的方法。
[0010]—種分布式系統(tǒng)中多線程同步的方法,包括:接收線程的資源控制請(qǐng)求,所述請(qǐng)求具有參數(shù),所述參數(shù)包括所述線程的標(biāo)識(shí)和所請(qǐng)求資源的資源名;根據(jù)所述資源名讀取所述資源的資源節(jié)點(diǎn)的數(shù)據(jù);嘗試鎖定所述資源,其中當(dāng)鎖定失敗,把該線程的標(biāo)識(shí)置于該資源的等待隊(duì)列以使得該線程進(jìn)入阻塞狀態(tài),當(dāng)鎖定成功,則該線程控制該資源,并且待所述線程利用所述資源完成執(zhí)行后,釋放所述資源,并喚醒該資源的等待隊(duì)列中的其他線程,其中被喚醒的線程能夠嘗試鎖定所述資源。
[0011 ]可選地,讀取所述資源的資源節(jié)點(diǎn)的數(shù)據(jù)的步驟包括:當(dāng)所述資源存在,則直接獲取所述資源的資源節(jié)點(diǎn),否則根據(jù)所述資源名創(chuàng)建相應(yīng)的資源節(jié)點(diǎn),并讀取所述資源節(jié)點(diǎn)的數(shù)據(jù)。
[0012]可選地,讀取所述資源的資源節(jié)點(diǎn)的數(shù)據(jù)之后,還包括:對(duì)所述資源進(jìn)行校驗(yàn),以確定所述資源有效且未被鎖定。
[0013]可選地,還包括:通過在所述資源節(jié)點(diǎn)下創(chuàng)建資源鎖定節(jié)點(diǎn)來鎖定所述資源,并通過刪除所述資源鎖定節(jié)點(diǎn)來釋放所述資源。
[0014]可選地,所述資源節(jié)點(diǎn)下包含如下部分,其中,同步隊(duì)列,所述同步隊(duì)列包括等待控制所述資源的線程;占用線程,所述占用線程是當(dāng)前控制所述資源的線程;自定義條件集合,所述自定義條件集合中的每個(gè)條件具有等待隊(duì)列。
[0015]可選地,線程在控制所述資源后,如果發(fā)現(xiàn)所述自定義條件集合中的條件不滿足,則釋放所述資源并進(jìn)入阻塞狀態(tài),且該線程的標(biāo)識(shí)被置于該條件的等待隊(duì)列。
[0016]可選地,當(dāng)所述自定義條件集合中的條件滿足后,把該條件的等待隊(duì)列中的線程從該條件的等待隊(duì)列移動(dòng)到所述資源的等待隊(duì)列。
[0017]根據(jù)本發(fā)明的另一方面,提供了一種分布式系統(tǒng)中多線程同步的系統(tǒng)。
[0018]—種分布式系統(tǒng)中多線程同步的系統(tǒng),包括:用于接收線程的資源控制請(qǐng)求的裝置,所述請(qǐng)求具有參數(shù),所述參數(shù)包括所述線程的標(biāo)識(shí)和所請(qǐng)求資源的資源名;用于根據(jù)所述資源名讀取所述資源的資源節(jié)點(diǎn)的數(shù)據(jù)的裝置;用于嘗試鎖定所述資源的裝置,其中當(dāng)鎖定失敗,把該線程的標(biāo)識(shí)置于該資源的等待隊(duì)列以使得該線程進(jìn)入阻塞狀態(tài),當(dāng)鎖定成功,則該線程控制該資源,并且待所述線程利用所述資源完成執(zhí)行后,釋放所述資源,并喚醒該資源的等待隊(duì)列中的其他線程,其中被喚醒的線程能夠嘗試鎖定所述資源。
[0019]可選地,所述資源節(jié)點(diǎn)下包含如下部分,其中,同步隊(duì)列,所述同步隊(duì)列包括等待控制所述資源的線程;占用線程,所述占用線程是當(dāng)前控制所述資源的線程;自定義條件集合,所述自定義條件集合中的每個(gè)條件具有等待隊(duì)列。
[0020]可選地,線程在控制所述資源后,如果發(fā)現(xiàn)所述自定義條件集合中的條件不滿足,則釋放所述資源并進(jìn)入阻塞狀態(tài),且該線程的標(biāo)識(shí)被置于該條件的等待隊(duì)列。
[0021]可選地,當(dāng)所述自定義條件集合中的條件滿足后,把該條件的等待隊(duì)列中的線程從該條件的等待隊(duì)列移動(dòng)到所述資源的等待隊(duì)列。
[0022]根據(jù)本發(fā)明的又一方面,提供了一種分布式系統(tǒng)中多線程同步的系統(tǒng)。
[0023]一種分布式系統(tǒng)中多線程同步的系統(tǒng),包括:存儲(chǔ)器和處理器,其中,所述存儲(chǔ)器存儲(chǔ)指令;所述處理器執(zhí)行所述指令用于:接收線程的資源控制請(qǐng)求,所述請(qǐng)求具有參數(shù),所述參數(shù)包括所述線程的標(biāo)識(shí)和所請(qǐng)求資源的資源名;根據(jù)所述資源名讀取所述資源的資源節(jié)點(diǎn)的數(shù)據(jù);嘗試鎖定所述資源,其中當(dāng)鎖定失敗,把該線程的標(biāo)識(shí)置于該資源的等待隊(duì)列以使得該線程進(jìn)入阻塞狀態(tài),當(dāng)鎖定成功,則該線程控制該資源,并且待所述線程利用所述資源完成執(zhí)行后,釋放所述資源,并喚醒該資源的等待隊(duì)列中的其他線程,其中被喚醒的線程能夠嘗試鎖定所述資源。
[0024]根據(jù)本發(fā)明的技術(shù)方案,通過基于分布式線程同步組件Zookeeper實(shí)現(xiàn)分布式系統(tǒng)中多機(jī)器線程對(duì)資源的控制和主動(dòng)釋放,利用Zookeeper的回調(diào)監(jiān)聽機(jī)制來通知客戶端進(jìn)行相關(guān)線程的分布式同步調(diào)用資源,極大提高了分布式線程同步的效率;同時(shí)本發(fā)明還支持自定義條件對(duì)線程同步的靈活控制,從而做到了線程主動(dòng)釋放資源以及根據(jù)自定義條件喚醒相關(guān)線程,進(jìn)而可以控制線程的執(zhí)行順序,且資源利用率高。
【附圖說明】
[0025]附圖用于更好地理解本發(fā)明,不構(gòu)成對(duì)本發(fā)明的不當(dāng)限定。其中:
[0026]圖1是根據(jù)本發(fā)明實(shí)施方式的分布式系統(tǒng)中多線程同步的方法的主要步驟示意圖;
[0027]圖2是本發(fā)明實(shí)施例的多線程同步樹形結(jié)構(gòu)圖;
[0028]圖3是本發(fā)明實(shí)施例的多線程獲取資源的流程圖;
[0029]圖4是根據(jù)本發(fā)明實(shí)施方式的分布式系統(tǒng)中多線程同步的系統(tǒng)的主要模塊示意圖。
【具體實(shí)施方式】
[0030]以下結(jié)合附圖對(duì)本發(fā)明的示范性實(shí)施例做出說明,其中包括本發(fā)明實(shí)施例的各種細(xì)節(jié)以助于理解,應(yīng)當(dāng)將它們認(rèn)為僅僅是示范性的。因此,本領(lǐng)域普通技術(shù)人員應(yīng)當(dāng)認(rèn)識(shí)至IJ,可以對(duì)這里描述的實(shí)施例做出各種改變和修改,而不會(huì)背離本發(fā)明的范圍和精神。同樣,為了清楚和簡(jiǎn)明,以下的描述中省略了對(duì)公知功能和結(jié)構(gòu)的描述。
[0031]圖1是根據(jù)本發(fā)明實(shí)施方式的分布式系統(tǒng)中多線程同步的方法的主要步驟示意圖。如圖1所示,本發(fā)明的分布式系統(tǒng)中多線程同步的方法主要包括如下的步驟Sll至步驟S13。
[0032]步驟Sll:接收線程的資源控制請(qǐng)求,該請(qǐng)求具有參數(shù),參數(shù)包括線程的標(biāo)識(shí)和所請(qǐng)求資源的資源名;
[0033]步驟S12:根據(jù)資源名讀取資源的資源節(jié)點(diǎn)的數(shù)據(jù);
[0034]步驟S13:嘗試鎖定資源,其中當(dāng)鎖定失敗,把該線程的標(biāo)識(shí)置于該資源的等待隊(duì)列以使得該線程進(jìn)入阻塞狀態(tài),當(dāng)鎖定成功,則該線程控制該資源,并且待該線程利用該資源完成執(zhí)行后,釋放該資源,并喚醒該資源的等待隊(duì)列中的其他線程,其中被喚醒的線程能夠嘗試鎖定該資源。
[0035]其中,步驟S12中讀取資源的資源節(jié)點(diǎn)的數(shù)據(jù)的步驟包括:當(dāng)所述資源存在,則直接獲取所述資源的資源節(jié)點(diǎn),否則根據(jù)所述資源名創(chuàng)建相應(yīng)的資源節(jié)點(diǎn),并讀取所述資源節(jié)點(diǎn)的數(shù)據(jù)。
[0036]并且,在讀取資源的資源節(jié)點(diǎn)的數(shù)據(jù)之后,還可以包括:對(duì)所述資源進(jìn)行校驗(yàn),以確定所述資源有效且未被鎖定。
[0037]根據(jù)本發(fā)明的技術(shù)方案,通過在所述資