源節(jié)點(diǎn)下創(chuàng)建資源鎖定節(jié)點(diǎn)來鎖定所述資源,并通過刪除所述資源鎖定節(jié)點(diǎn)來釋放所述資源。
[0038]并且,在每個(gè)資源節(jié)點(diǎn)下可以包含如下部分,其中,同步隊(duì)列,所述同步隊(duì)列包括等待控制所述資源的線程;占用線程,所述占用線程是當(dāng)前控制所述資源的線程;自定義條件集合,所述自定義條件集合中的每個(gè)條件具有等待隊(duì)列。
[0039]線程在控制所述資源后,如果發(fā)現(xiàn)所述自定義條件集合中的條件不滿足,則釋放所述資源并進(jìn)入阻塞狀態(tài),且該線程的標(biāo)識(shí)被置于該條件的等待隊(duì)列。并且,當(dāng)所述自定義條件集合中的條件滿足后,把該條件的等待隊(duì)列中的線程從該條件的等待隊(duì)列移動(dòng)到所述資源的等待隊(duì)列。
[0040]圖2是本發(fā)明實(shí)施例的多線程同步樹形結(jié)構(gòu)圖。本發(fā)明作為分布式系統(tǒng)中多線程同步的組件,線程對(duì)資源的鎖定全部由本發(fā)明的線程同步組件來實(shí)現(xiàn),對(duì)上層系統(tǒng)的線程是透明的。本發(fā)明基于Zookeeper進(jìn)行分布式系統(tǒng)中多線程的同步,根據(jù)Zookeeper的回調(diào)監(jiān)聽機(jī)制來通知系統(tǒng)中相關(guān)線程使用資源進(jìn)行操作。
[0041]如圖2所示,表示了整個(gè)Zookeeper系統(tǒng)中多機(jī)器線程及資源存儲(chǔ)的樹形結(jié)構(gòu)。以V”來分割每一級(jí)節(jié)點(diǎn)。其中,/synchor/clients下的所有的子節(jié)點(diǎn)是表示使用本發(fā)明進(jìn)行線程同步的服務(wù)器節(jié)點(diǎn)。每個(gè)服務(wù)器節(jié)點(diǎn)存了該服務(wù)器的IP地址、該服務(wù)器的唯一標(biāo)識(shí)、以及該服務(wù)器所使用的操作系統(tǒng)類型等基本信息,且這些基本信息是由服務(wù)器在啟動(dòng)的時(shí)候推送到本發(fā)明的組件并在Zookeeper的相應(yīng)節(jié)點(diǎn)進(jìn)行注冊(cè)。/synchro/rsLocks下的所有節(jié)點(diǎn)表示的是所有的使用到的資源信息對(duì)應(yīng)的節(jié)點(diǎn)。每個(gè)資源節(jié)點(diǎn)是動(dòng)態(tài)生成的,且每個(gè)資源節(jié)點(diǎn)下包含了同步隊(duì)列節(jié)點(diǎn)(synQueues),占用線程節(jié)點(diǎn)(locked),和自定義條件集合(condit1ns)節(jié)點(diǎn)。其中,同步隊(duì)列包括等待控制該資源的線程;占用線程是當(dāng)前控制該資源的線程;自定義條件集合,是可以動(dòng)態(tài)指定生成的,但是已定的條件節(jié)點(diǎn)下如有線程在等待,則該條件不會(huì)變化,如需增加新的條件可添加新的節(jié)點(diǎn)來實(shí)現(xiàn),并且該自定義條件集合中每個(gè)條件具有等待隊(duì)列。
[0042]另外,本發(fā)明中對(duì)資源定義例如可以是字符串,在整個(gè)分布式環(huán)境中不同的字符串內(nèi)容就表示不同的資源。
[0043]圖3是本發(fā)明實(shí)施例的多線程獲取資源的流程圖。如圖3所示,本發(fā)明中,分布式系統(tǒng)中的多服務(wù)器線程會(huì)主動(dòng)申請(qǐng)獲取資源。
[0044]當(dāng)分布式系統(tǒng)中,某臺(tái)服務(wù)器上的某線程申請(qǐng)控制某資源時(shí),會(huì)發(fā)送資源控制請(qǐng)求到本發(fā)明的分布式同步組件Zookeeper,其中,資源控制請(qǐng)求的參數(shù)中包括該服務(wù)器的唯一標(biāo)識(shí)、該線程的唯一標(biāo)識(shí)以及請(qǐng)求訪問的資源的資源名(說明lhZookeeper接收到資源控制請(qǐng)求后,會(huì)對(duì)該請(qǐng)求的參數(shù),進(jìn)行初步解析和初始化(說明2),以獲取該請(qǐng)求中包含的資源名。然后,Zookeeper會(huì)根據(jù)資源名查找并嘗試獲取該資源節(jié)點(diǎn)的值。此時(shí),Zookeeper會(huì)先判斷當(dāng)前資源節(jié)點(diǎn)是否存在(說明3),如果該資源節(jié)點(diǎn)存在,則會(huì)通知該線程直接讀取該資源節(jié)點(diǎn)的值;如果該資源節(jié)點(diǎn)不存在,則會(huì)先根據(jù)資源名創(chuàng)建相應(yīng)的節(jié)點(diǎn),然后再讀取該資源節(jié)點(diǎn)的值(說明4)。在獲取該資源節(jié)點(diǎn)的值后,會(huì)進(jìn)行信息校驗(yàn),一是校驗(yàn)該資源節(jié)點(diǎn)的資源是否為所需要的資源,以及該資源節(jié)點(diǎn)的內(nèi)容是否已過期等,亦即校驗(yàn)該資源節(jié)點(diǎn)的值是否有效;二是根據(jù)該資源節(jié)點(diǎn)的值判定該資源節(jié)點(diǎn)是否已被鎖定(有其他線程正在使用該資源),其中,該資源節(jié)點(diǎn)若已被鎖定,會(huì)包含已鎖定的標(biāo)識(shí)信息。
[0045]當(dāng)該線程獲取到該資源節(jié)點(diǎn)的值,且驗(yàn)證所述資源有效且未被鎖定后,Zookeeper會(huì)嘗試鎖定該資源以避免其他線程同時(shí)使用該資源。本發(fā)明通過在資源節(jié)點(diǎn)下創(chuàng)建資源鎖定節(jié)點(diǎn)來鎖定資源。例如,本發(fā)明對(duì)資源鎖定的方式是直接創(chuàng)建/synchro/rsLocks/資源名稱節(jié)點(diǎn)/locked,其中,“/locked”即為資源鎖定節(jié)點(diǎn)。如果創(chuàng)建成功,則說明當(dāng)前鎖定成功,且該資源鎖定節(jié)點(diǎn)的值為“服務(wù)器唯一標(biāo)識(shí)+線程唯一標(biāo)識(shí)”。如果在創(chuàng)建資源鎖定節(jié)點(diǎn)時(shí),返回此節(jié)點(diǎn)已經(jīng)存在,則比較資源鎖定節(jié)點(diǎn)“/locked”的值與資源控制請(qǐng)求的參數(shù)中包含的“服務(wù)器唯一標(biāo)識(shí)+線程唯一標(biāo)識(shí)”是否一致,如果一致,則說明該資源已經(jīng)被該線程獲取,返回鎖定成功,否則鎖定失敗(說明5)。
[0046]如果返回鎖定資源成功,則該線程根據(jù)自定義的條件邏輯執(zhí)行后續(xù)的操作,且在操作完成或者在需要主動(dòng)釋放資源的情況下會(huì)釋放資源并阻塞該線程,以便其他線程可以控制該資源(說明9)。其中,需要主動(dòng)釋放資源的情況會(huì)在后文中進(jìn)行詳細(xì)介紹,此處略過。如果返回鎖定資源失敗,貝1J直接將該線程放入/synchro/rsLocks/資源節(jié)點(diǎn)/synQueues/節(jié)點(diǎn)下,表示該線程在等待資源被釋放(說明6)。同時(shí),在鎖定資源失敗后,服務(wù)器本地會(huì)得到返回結(jié)果,并在本地將線程彳目息緩存起來。在進(jìn)行線程?目息緩存時(shí),可以鍵名-鍵值對(duì)(Key-value)的形式進(jìn)行存儲(chǔ),其中鍵名Key為“服務(wù)器唯一標(biāo)識(shí)+線程唯一標(biāo)識(shí)”。同時(shí)線程會(huì)立刻阻塞不可用(說明7)。并且,在其他線程執(zhí)行完成并且釋放資源后,根據(jù)預(yù)設(shè)的線程執(zhí)行順序會(huì)被喚醒變成可用,并重新嘗試鎖定資源。
[0047]其中,在一個(gè)線程執(zhí)行完預(yù)定的邏輯后,會(huì)嘗試釋放資源。資源釋放的過程如下:首先,Zookeeper會(huì)刪除資源鎖定節(jié)點(diǎn)“/locked”,然后,會(huì)將/synchro/rsLocks/資源節(jié)點(diǎn)/synQueues/下的一個(gè)節(jié)點(diǎn)取出。由于Zookeeper的客戶端監(jiān)聽了相應(yīng)資源節(jié)點(diǎn),當(dāng)對(duì)資源節(jié)點(diǎn)下的等待隊(duì)列(synQueue s)刪除節(jié)點(diǎn)的時(shí)候,會(huì)通知所有相關(guān)的服務(wù)器。服務(wù)器節(jié)點(diǎn)收到回調(diào)通知后,判定當(dāng)前移出該資源節(jié)點(diǎn)下的等待隊(duì)列的節(jié)點(diǎn)是否是與自己相關(guān)的節(jié)點(diǎn),如果是,就會(huì)以“服務(wù)器唯一標(biāo)識(shí)+線程唯一標(biāo)識(shí)”為鍵名Key,從服務(wù)器本地內(nèi)存中取出對(duì)應(yīng)的線程信息,讓線程變得可用,并且該線程會(huì)重新去申請(qǐng)資源(說明8)。
[0048]當(dāng)一個(gè)線程執(zhí)行完對(duì)應(yīng)的邏輯操作并釋放資源后,Zookeeper會(huì)從資源的等待同步隊(duì)列synQueues中取出其他節(jié)點(diǎn)并嘗試鎖定資源(說明9) C3Zookeeper在從等待同步隊(duì)列synQueues中取出節(jié)點(diǎn)時(shí),可靈活設(shè)置規(guī)則,例如:可公平取出(采用公平鎖),即:將等待同步隊(duì)列中的第一個(gè)節(jié)點(diǎn)取出;也可不公平取出(采用不公平鎖),最簡(jiǎn)單的即為隨機(jī)取出,任何線程都可嘗試鎖定資源;還可設(shè)置規(guī)則例如根據(jù)所有線程請(qǐng)求控制資源的時(shí)間的先后順序來取等,例如:當(dāng)一個(gè)線程執(zhí)行完對(duì)應(yīng)的邏輯操作并釋放資源后,資源節(jié)點(diǎn)下的條件隊(duì)列“/ synchro/rsLocks/rs/condt1ns/conditonl” 中所有符合條件 condi ton I 的線程都會(huì)轉(zhuǎn)移到等待同步隊(duì)列中,此時(shí)可根據(jù)等待同步隊(duì)列中所有線程的資源控制請(qǐng)求時(shí)間來排序并依次取出各線程。
[0049]另外,本發(fā)明還可以實(shí)現(xiàn)根據(jù)自定義條件主動(dòng)控制資源鎖。本發(fā)明中線程對(duì)資源的占用分為主動(dòng)占用和被動(dòng)占用兩種?;谧远x條件執(zhí)行線程同步是控制線程按照預(yù)設(shè)的執(zhí)行順序執(zhí)行的重要手段。當(dāng)某個(gè)線程已經(jīng)獲取了資源后,發(fā)現(xiàn)其中某些自定義的條件還未滿足,則該線程會(huì)主動(dòng)阻塞當(dāng)前線程,并且釋放當(dāng)前資源以便其他線程可以使用該資源。待其他線程執(zhí)行完成且該線程已滿足所有自定義條件時(shí),該線程會(huì)被重新喚醒并繼續(xù)執(zhí)行自身的代碼邏輯。
[0050]本發(fā)明中線程根據(jù)自定義條件執(zhí)行線程同步的步驟為:
[0051 ] 步驟A:服務(wù)器sI上的線程a獲取到資源(rs),貝IjZookeeper會(huì)執(zhí)行寫/synchro/rsLocks/rs/locked節(jié)點(diǎn);
[0052]步驟B:線程a在執(zhí)行過程中,發(fā)現(xiàn)執(zhí)行的條件(condit1nl)不滿足,就會(huì)將condit1nl和該線程的信息(服務(wù)器唯一標(biāo)識(shí)+線程a的唯一標(biāo)識(shí))傳到本發(fā)明的線程同步組件Zookeeper,以申請(qǐng)阻塞當(dāng)前線程,并且,該線程被重新喚醒的條件為即為“滿足條件condit1nl,,;
[0053]步驟C: Zookeeper在收到該線程的阻塞請(qǐng)求后,會(huì)將“/synchro/rsLocks/rs/locked”節(jié)點(diǎn)的信息復(fù)制到一個(gè)新創(chuàng)建的節(jié)點(diǎn):“/synchro/rsLocks/rs/condt1ns/conditonl/sl_a”;
[0054]步驟D:然后,刪除上述的lo