專利名稱::同步優(yōu)化的方法及設(shè)備的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及計算機技術(shù),更具體地涉及同步優(yōu)化技術(shù)。
背景技術(shù):
:Java是一種在語言級別上支持多線程編程的程序設(shè)計語言,它提供基于監(jiān)視器機制的同步方法和同步語句來用于線程間的同步。Java中每個對象有一個對應(yīng)的監(jiān)視器,線程可以通過同步方法調(diào)用和同步語句對某對象進行加鎖/解鎖,每次只有一個線程可以持有某監(jiān)視器上的鎖,其他試圖對這個監(jiān)視器加鎖的線程都將被阻塞直到它們獲得這個監(jiān)視器上的鎖。為了保證多線程安全,java標準庫中的很多類都必須設(shè)計成線程安全的,也就是在訪問共享凄t據(jù)時需要添加同步才喿作,如java.util.Vector類、java.util.Hashtable類等,應(yīng)用程序可以在多線程環(huán)境中簡單安全地使用這些庫所提供的功能。除了可以通過調(diào)用Java標準庫中各個線程安全的類和方法外,程序員還可以自己利用同步方法和同步語句來實現(xiàn)多線程對共享數(shù)據(jù)的互斥訪問,以確保程序的正確性。雖然Java中的同步機制能方便地保證多線程的安全,但是也給多線程程序的運行帶來非常大的開銷。據(jù)研究表明,同步開銷通常占總執(zhí)行時間的5°/。-10%;在對Marmot(—種Java優(yōu)化編譯器)的測試中,5個中等大小的單線程程序在同步上花費了26%~60%的時間。由此,開展同步優(yōu)化(synchronizationoptimization)是十分重要的。同步優(yōu)化旨在降低同步操作的開銷,提高程序的整體性能。為了減少同步操作的開銷,一些方法直接改良同步原語的實現(xiàn),比如,痩鎖(thinlock)技術(shù)和鎖保留(lockreservation)技術(shù)。還有一些方法利用靜態(tài)程序分析技術(shù)自動分析并消除不必要的同步操作,比如,鎖取消(lockelision)技術(shù)和鎖粗化(lockcoarsening,lockcoalescence)技術(shù)。鎖取消技術(shù)利用逃逸分析(escapeanalysis)技術(shù)確定出線程局部(thread-local)的對象,然后取消這些對象上的同步操作。鎖粗化技術(shù)合并某些作用于同一同步對象上的多個同步操作,合并之后會導致被同步的代碼區(qū)域范圍增大,這在多線程的環(huán)境下會引起程序并發(fā)度的下降,尤其是在線程數(shù)目非常多的情況下,對并發(fā)度的影響會更加明顯。影響的同步優(yōu)化的方案。
發(fā)明內(nèi)容為了解決上述問題之一,本發(fā)明提出了一種同步優(yōu)化方法,包括以下步驟對被編譯方法進行靜態(tài)程序分析,根據(jù)分析結(jié)果確定所述被編譯方法中無須對同步對象進行同步操作的同步方法調(diào)用點,并對所述同步方法調(diào)用點進行標記;根據(jù)所述標記的同步方法調(diào)用點為其調(diào)用的同步方法編譯生成允許不對所述同步方法的同步對象執(zhí)行同步操作的本地代碼;根據(jù)所述標記的同步方法調(diào)用點扭J亍所述本地^^碼。根據(jù)本發(fā)明的實施例,所述對被編譯方法進行靜態(tài)程序分析,確定無須對同步對象進行同步操作的同步方法調(diào)用點的步驟包括合并作用于同一個同步對象上的相鄰同步區(qū)域和/或嵌套同步區(qū)域,將包含在所述合并后的同步區(qū)域內(nèi)的同步方法調(diào)用點確定為所述冗余同步方法調(diào)用點。根據(jù)本發(fā)明的實施例,所述對被編譯方法進行靜態(tài)程序分析,確定無須對同步對象進行同步操作的同步方法調(diào)用點的步驟包括根據(jù)對象是否在多個線程間共享確定對所述對象的同步方法調(diào)用點是否是無須對同步對象進行同步操作的同步方法調(diào)用點。根據(jù)本發(fā)明的實施例,根據(jù)對象是否在多個線程間共享確定對所述對象的同步方法調(diào)用點是否是無須對同步對象進行同步操作的同步方法調(diào)用點的步驟包括如果所述對象只在創(chuàng)建所述對象的線程中被訪問,則將作用于所述對象的同步方法調(diào)用點確定為所述無須對同步對象進行同步操作的同步方法調(diào)用點。根據(jù)本發(fā)明的實施例,根據(jù)所述標記的同步方法調(diào)用點為同步方法編譯生成允許不對所述同步方法的同步對象執(zhí)行同步操作的本地代碼的步驟包括根據(jù)所述標記的同步方法調(diào)用點為所述同步方法編譯生成所述同步方法的普通版本和所述同步方法的非同步版本,其中所述同步方法的非同步版本包括忽略對所述同步方法的同步對象上的同步操作而生成的本地代碼。根據(jù)本發(fā)明的實施例,根據(jù)所述標記的同步方法調(diào)用點為其調(diào)用的同碼的步驟包括根據(jù)所述標記的同步方法調(diào)用點為所述同步方法編譯生成所述同步方法的分支版本,并在所述被標記的同步方法調(diào)用點前插入一條在所述同步方法入口處插入獲得標記信息的指令和清除標記的指令;在作用在所述同步方法的同步對象上的同步操作之前插入分支指令,所述分支指令判斷獲得的標記信息,若所述標記信息為真,則跳轉(zhuǎn)到所述同步操作之后,如果所述標記信息為假,則執(zhí)行所述同步操作。根據(jù)本發(fā)明的實施例,執(zhí)行所述本地代碼的步驟包括當執(zhí)行同步方法調(diào)用點時,如果所述同步方法調(diào)用點為標記的同步方法調(diào)用點,則調(diào)用所述非同步版本的本地代碼,如果所述同步方法調(diào)用點為沒有標記的同步方法調(diào)用點,則調(diào)用所述普通版本的本地代碼。根據(jù)本發(fā)明的實施例,執(zhí)行所述本地代碼的步驟包括當執(zhí)行到同步方法調(diào)用點時,根據(jù)所述同步方法調(diào)用點前設(shè)置的標記信息指令調(diào)用所述分支版本的本地代碼。根據(jù)本發(fā)明的實施例,對被編譯方法進行靜態(tài)程序分析中出現(xiàn)以下情況之一時不進行將同步方法調(diào)用點確定為無須對同步對象進行同步操作的同步方法調(diào)用點的步驟作用于同一個同步對象上的相鄰同步方法調(diào)用點和同步操作之間包含作用于其他對象上的同步操作;所述作用于同一個同步對象上的相鄰同步方法調(diào)用點和同步操作之間包含訪問易變volatile數(shù)據(jù)的操作;所述作用于同一個同步對象上的相鄰同步方法調(diào)用點和同步操作之間包含靜態(tài)無法解析的訪問或方法調(diào)用;所述作用于同一個同步對象上的相鄰同步方法調(diào)用點和同步操作之間包含循環(huán);所述作用于同一個同7步對象上的相鄰同步方法調(diào)用點和同步操作之間包含鎖定次數(shù)不一致的操作,所述鎖定次數(shù)不一致的操作所屬的控制流圖CFG節(jié)點的各個前驅(qū)節(jié)點被鎖定的次數(shù)不同。本發(fā)明還提出了一種同步優(yōu)化設(shè)備,包括分析模塊、編譯模塊和執(zhí)行模塊。其中,所述分析模塊用于對被編譯方法進行靜態(tài)程序分析,根據(jù)分析結(jié)果確定所述被編譯方法中無須對同步對象進行同步操作的同步方法調(diào)用點,并對所述同步方法調(diào)用點進行標記;所述編譯模塊用于根據(jù)所述標的同步對象執(zhí)行同步操作的本地代碼;所述執(zhí)行模塊用于根據(jù)所述標記的同步方法調(diào)用點執(zhí)行所述本地代碼。本發(fā)明所提出的同步優(yōu)化的方法及設(shè)備具有高度的靈活性和良好的可擴展性。本發(fā)明上述的和/或附加的方面和優(yōu)點從下面結(jié)合附圖對實施例的描述中將變得明顯和容易理解,其中圖1是根據(jù)本發(fā)明的一個實施例的同步優(yōu)化方法的流程圖2是根據(jù)本發(fā)明的一個實施例的同步方法的代碼版本的示意圖3是根據(jù)本發(fā)明的一個實施例的雙版本算法示意圖4是根據(jù)本發(fā)明的一個實施例的分支版本算法示意圖5是根據(jù)本發(fā)明的一個實施例的同步優(yōu)化設(shè)備的示意圖6是根據(jù)本發(fā)明的一個實施例的未使用方法內(nèi)聯(lián)時的吞吐量對比示意圖7是根據(jù)本發(fā)明的一個實施例的使用方法內(nèi)聯(lián)后的吞吐量對比示意圖。具體實施例方式下面詳細描述本發(fā)明的實施例,所述實施例的示例在附圖中示出。下面通過參考附圖描述的實施例是示例性的,僅用于解釋本發(fā)明,而不能解釋為對本發(fā)明的限制。同步優(yōu)化在改善應(yīng)用程序的同步開銷的同時,也耗費了較大的程序分析開銷。為了權(quán)衡過程間同步優(yōu)化的開銷和收益,本發(fā)明對同步方法的調(diào)用點進行優(yōu)化,因為l)在實際的代碼中,同步方法調(diào)用所花的同步開銷在總同步開銷中占很大比重;2)對同步方法的調(diào)用點的分析相對比較簡單。作為本發(fā)明的一個實施例,一個static的同步方法(即類同步方法)的同步對象是指該方法所屬的類對應(yīng)的Class對象;一個非static同步方法(即實例同步方法)的同步對象是指該方法的this對象;一個同步語句的同步對象是指在該同步語句中的圓括號內(nèi)顯式指定的對象,即同步語句synchronized(0){...}中的O。在字節(jié)碼級,語言級的同步語句變換成以monitorenter(加鎖,即獲得同步對象上的監(jiān)視器)指令開始、以monitorexit(解鎖,即釋放相應(yīng)的監(jiān)視器)指令結(jié)束的指令序列。同步方法在字節(jié)碼級則是在其常量池條目中設(shè)置有同步標志ACC—SYNCRONIZED,方法調(diào)用指令會4企查這個標志,當調(diào)用一個設(shè)置有該標志的方法時(即調(diào)用同步方法時),當前線程將獲取監(jiān)視器,然后調(diào)用執(zhí)行方法體本身,不論方法調(diào)用是正常結(jié)束還是異常結(jié)束都要釋放這個監(jiān)視器。為便于描述,本發(fā)明中統(tǒng)一用lock(O)和unlock(O)分別表示對對象O進行加鎖和解鎖。作為本發(fā)明的一個實施例,作用于對象O的一個同步區(qū)域是指從對該對象加鎖到對該對象解鎖的一段連續(xù)執(zhí)行的指令序列形成的代碼區(qū)域。本發(fā)明提出一種優(yōu)化同步方法及其調(diào)用點的同步方法優(yōu)化框架,其基本思想是分析出無須對同步對象進行同步的同步方法調(diào)用點,將其改成對該同步方法的非同步版本的調(diào)用,或者是設(shè)置標記信息并調(diào)用該同步方法的分支版本。該框架由程序分析、編譯和執(zhí)行3個階段組成。下面分別簡述這3個階段。如圖1所示為根據(jù)本發(fā)明的一個實施例的同步優(yōu)化方法100的流程圖。如圖所示,該方法100包括以下步驟S101:對^皮編譯方法進^f于靜態(tài)程序分析,一艮據(jù)分析結(jié)果確定纟皮編if方法中無須對同步對象進行同步操作的同步方法調(diào)用點,并對該同步方法調(diào)用點進行標記。該步驟或稱程序分析階段。作為本發(fā)明的一個實施例,當編譯器對Java程序中的一個方法進行編譯時,對被編譯方法進行靜態(tài)程序分析,根據(jù)分析結(jié)果確定被編譯方法中的哪些同步方法調(diào)用點在其同步對象上的同步操作是冗余的,并對這些同步方法調(diào)用點進行標記。作為本發(fā)明的一個實施例,在該階段,可以采用不同的程序分析技術(shù)來對被編譯方法進行分析以確定哪些同步方法調(diào)用點需要標記,這些分析技術(shù)可以基于鎖粗化技術(shù),也可以基于逃逸分析技術(shù),或者是其他技術(shù)。作為本發(fā)明的一個實施例,程序分析階段可以采用基于鎖粗化的程序分析。作為本發(fā)明的一個實施例,基于鎖粗化的同步優(yōu)化的主要思想是如果線程T在獲得鎖而未釋放該鎖期間又獲取同一個鎖,那么第2個鎖獲取操作是不必要的;如果線程T連續(xù)多次獲得并釋放同一個鎖,那么可以將這些鎖獲取和鎖釋放操作合并成一對,以減少鎖操作的數(shù)量。作為本發(fā)明的一個實施例,基于鎖粗化技術(shù)分析識別無須同步的同步方法調(diào)用點的主要方法包括合并作用于同一個同步對象上的相鄰同步區(qū)域或嵌套同步區(qū)域以減少同步操作的數(shù)量。如果把同步方法調(diào)用看作是一種特殊的同步區(qū)域并讓它與相鄰的同步區(qū)域或者是包含它的同步區(qū)域相合并,那么包含在合并后的同步區(qū)域內(nèi)的同步方法調(diào)用點在其同步對象上的同步操作是冗余的,從而可以對這些調(diào)用點進行標記。作為本發(fā)明的一個實施例,程序分析階段可以采用基于逃逸分析的程序分析。作為本發(fā)明的一個實施例,基于逃逸分析的同步優(yōu)化的主要思想是如果某個線程T對對象O進行同步操作期間沒有其他線程T'對進行訪問,那么就可以刪除線程T對O的同步操作。在Java應(yīng)用程序中,常有些看似是單線程的程序使用JDK中的幫助線程,這些程序?qū)嶋H上是多線程的,但是幫助線程并不和應(yīng)用程序的單線程共享數(shù)據(jù);基于逃逸分析會識別出一些線程局部的對象,這些對象只被創(chuàng)建其的線程訪問,對這些對象的訪問是不需要同步的。10作為本發(fā)明的一個實施例,根據(jù)一個對象是否在多個線程間共享來決定是否刪除作用于該對象上的同步操作。如果一個對象O只在創(chuàng)建它的線程中被訪問(即o未逃逸出線程),則所有作用于o的同步操作(包括o的同步方法調(diào)用所涉及的、對o的同步操作)是冗余的,從而可以對o的同步方法的任意調(diào)用點進行標記。需要說明的是,程序分析階段的目的是分析識別出無須同步的同步方用其他的技術(shù)。只要這項技術(shù)能識別出無須同步的同步方法調(diào)用點,這項技術(shù)就可以被本發(fā)明所述的同步方法優(yōu)化框架的程序分析階段所使用。S102:根據(jù)所述標記的同步方法調(diào)用點為同步方法編譯生成允許不對同步方法的同步對象執(zhí)行同步操作的本地代碼,該步驟或稱編譯階段。作為本發(fā)明的一個實施例,根據(jù)需要,可以采用雙版本策略或分支版本策略為同步方法編i,生成不同版本的本地代碼。作為本發(fā)明的一個實施例,雙版本策略可以包括為一個同步方法編譯生成兩個版本的本地代碼,一個為該方法的普通版本,另一個為該方法的非同步版本。作為本發(fā)明的一個實施例,一個同步方法的普通版本是指同步版本是指在編譯該方法的代碼時,忽略對該方法的同步對象上的所有同步操作而生成的本地代碼。作為本發(fā)明的一個實施例,分支版本策略可以包括為一個同步方法編譯生成一個分支版本的本地代碼,并在被標記的同步方法調(diào)用點前插入一條設(shè)置標記信息的指令。作為本發(fā)明的一個實施例,一個同步方法的分支版本是指在編譯該方法對應(yīng)的代碼時,增加如下處理(a)在方法入口處插入一條獲得標記信息的指令和一條清除標記的指令;(b)對于每個作用在該方法的同步對象上的同步操作,在其之前插入一條分支指令,該分支指令判斷獲得的標記信息,若為真,則跳轉(zhuǎn)到該同步操作之后,否則,執(zhí)行該同步操作。如圖2所示為根據(jù)本發(fā)明的一個實施例的同步方法的不同代碼版本的示意圖。以圖^a)中的實例同步方法setSharedField()為例,圖2中(b)、(c)和(d)分別給出其普通版本、非同步版本和分支版本的偽代碼。在(b)圖中,執(zhí)行方法體中的代碼之前和之后需要分別對this對象加鎖和解鎖;在(c)圖中,直接執(zhí)行方法體中的代碼;在(d)圖中,首先獲取當前方法被調(diào)用時的標記信息marked,然后清除標記,4妄著對每個作用在this對象上的加鎖和解鎖操作增加分支指令以保證這些操作在marked為假時才被執(zhí)行。雙版本策略和分支版本策略有各自的優(yōu)缺點。雙版本策略為一個同步方法生成并保存兩個版本的本地代碼,而分支版本策略只需要為一個同步方法生成并保存一個版本的本地代碼,故雙版本策略需要額外的空間開銷并且需要虛擬機內(nèi)核支持對多版本本地代碼的管理。另一方面,雙版本策略為一個同步方法生成的每個版本的本地代碼中沒有添加判斷該方法的當前調(diào)用是否被標記的分支操作,而分支版本策略則添加了額外的這類分支操作,故分支版本會在一定程度上影響程序的運行時性能。雙版本策略適合那些被標記的同步方法數(shù)目少但調(diào)用頻率高的情況,分支版本策略則適合那些被標記的同步方法數(shù)目多且調(diào)用頻率低的情況。在進行同步方法優(yōu)化時,可以根據(jù)應(yīng)用程序的特點來決定是使用雙版本策略還是使用分支版本策略,或者是設(shè)計一種啟發(fā)式算法,讓編譯器自動選擇最合適的策略。S103:根據(jù)標記的同步方法調(diào)用點執(zhí)行本地代碼,該步驟或稱執(zhí)行階段。該階段負責執(zhí)行本地代碼,它根據(jù)編譯階段采取的是雙版本策略還是分支版本策略而略有不同。作為本發(fā)明的一個實施例,如果編譯階段采取的是雙版本策略,當執(zhí)行到一個同步方法的調(diào)用點時,若在程序分析階段標記過該調(diào)用點,則調(diào)用其非同步版本的本地代碼,否則,調(diào)用其普通版本的本地代碼。作為本發(fā)明的一個實施例,如果編譯階段采取的是分支版本策略,當執(zhí)行到一個同步方法的調(diào)用點時,根據(jù)程序分析階段是否標記過該調(diào)用點來決定是否設(shè)置標記信息,然后調(diào)用其分支版本的本地代碼。以上所述的同步方法優(yōu)化方法包括程序分析、編譯和執(zhí)行三個階段,前兩個階段分別可以采取不同的策略。以下介紹同步方法優(yōu)化框架的幾個應(yīng)用實例,即基于鎖粗化的雙版本同步方法優(yōu)化算法(簡稱雙版本粗化算法)、基于鎖粗化的分支版本同步方法優(yōu)化算法(簡稱分支版本粗化算法)、基于逃逸分析的雙版本同步方法優(yōu)化算法(簡稱雙版本逃逸算法)和基于逃逸分析的分支版本同步方法優(yōu)化算法(簡稱分支版本逃逸算法)等。雙版本粗化算法是指在同步方法優(yōu)化框架的程序分析階段采用鎖粗化分析技術(shù)、編譯階段采用雙版本策略所形成的同步方法優(yōu)化算法;分支版本粗化算法指在同步方法優(yōu)化框架的程序分析階段采用鎖粗化分析技術(shù)、編譯階段采用分支版本策略所形成的同步方法優(yōu)化算法;雙版本逃逸算法指在同步方法優(yōu)化框架的程序分析階段采用逃逸分析技術(shù)、編譯階段采用雙版本策略所形成的同步方法優(yōu)化算法;分支版本逃逸算法指在同步方法優(yōu)化框架的程序分析階段采用逃逸分析技術(shù)、編譯階段采用分支版本策略所形成的同步方法優(yōu)化算法。作為本發(fā)明的一個實施例,雙版本粗化算法包括以下兩個部分1)利用Java虛擬機的即時編譯器(JIT)對每個被編譯方法的CFG(控制流圖)進行程序分析和變換,執(zhí)行如下操作(a)找到作用于同一個同步對象上的、可以合并的相鄰同步方法調(diào)用點以及同步操作,將它們進行合并并標記在合并區(qū)域內(nèi)的同步方法調(diào)用點。(b)在作用于某同步對象的同步語句塊內(nèi)部,找到作用于該同步對象上的、可以合并的同步操作和同步方法調(diào)用點,刪除這些同步操作并標記這些同步方法調(diào)用點。2)修改Java虛擬機中負責協(xié)調(diào)Java方法的編譯和執(zhí)行的組件,即編譯流水線及虛擬機內(nèi)核VMCore。當執(zhí)行到一個同步方法調(diào)用點時,如果該調(diào)用點未被標記,沖全查該同步方法的普通版本的本地代碼是否存在,如果存在,則執(zhí)行之,否則啟動JIT編譯流水線為之編譯生成普通版本的本地代碼,然后執(zhí)行之;如果該調(diào)用點被標記,檢查該同步方法的非同步版本的本地代碼是否存在,如果存在,則纟丸行之,否則啟動JIT編-澤生成非同步版本的本地代碼,然后執(zhí)行之。作為本發(fā)明的一個實施例,如果作用于同一個同步對象上的相鄰同步方法調(diào)用點和同步操作之間存在下列情況之一,則不能進行上述的優(yōu)化過程條件l:包含作用于其他對象上的同步操作。條件2:包含訪問易變(volatile)數(shù)據(jù)的操作。條件3:包含靜態(tài)無法解析的訪問或方法調(diào)用。條件4:包含循環(huán)。條件5:某操作對應(yīng)于CFG中的節(jié)點的各個前驅(qū)節(jié)點被鎖定的次數(shù)不同。獲得不同的鎖而可能產(chǎn)生死鎖;條件34是為了防止同步區(qū)域合并產(chǎn)生超大的同步區(qū)域而降低多線程程序的并發(fā)度;條件5是一種復雜的情況,這種情況出現(xiàn)的概率幾乎為0,故該算法不處理這種情況。作為本發(fā)明的一個實施例,分支版本粗化算法利用Java虛擬才幾的即時(a)找到作用于同一個同步對象上的、可以合并的相鄰同步方法調(diào)用點以及同步操作,將它們進行合并并在這些同步方法調(diào)用點前插入一條標記指令(該指令將標記信息置為真)。(b)在作用于某同步對象的同步語句塊內(nèi)部,找到作用于該同步對象上的、可以合并的同步操作和同步方法調(diào)用點,刪除這些同步操作,并在這些同步方法調(diào)用點前插入一條標記指令(該指令將標記信息置為真)。(c)如果當前一皮編譯方法是標記過的同步方法,為其變換生成分支版本的本地代碼。與雙版本粗化算法一樣,如果作用于同一個同步對象上的相鄰同步方法調(diào)用點和同步操作之間存在條件15之一,則不能進行上述的優(yōu)化過程。作為本發(fā)明的一個實施例,雙版本逃逸算法和分支版本逃逸算法在同步方法優(yōu)化框架的程序分析階段采用逃逸分析技術(shù),如果逃逸分析的結(jié)果表明對象O未逃逸出某個線程,即對象o只^:該線程訪問,則可以對作用于同步對象O的所有同步方法調(diào)用點進行標記。作為本發(fā)明的一個實施例,對于雙版本逃逸算法,與雙版本粗化算法類似,還需要修改編譯流水線及虛擬機內(nèi)核VMCore。當執(zhí)行到一個同步方法調(diào)用點時,如果該調(diào)用點未,皮標記,才企查該同步方法的普通版本的本14地代碼是否存在,如果存在,則執(zhí)行之,否則啟動JIT編譯流水線編譯生成普通版本的本地代碼,然后執(zhí)行之;如果該調(diào)用點被標記,4全查該同步方法的非同步版本的本地代碼是否存在,如果存在,則執(zhí)行之,否則啟動JIT編譯生成非同步版本的本地代碼,然后執(zhí)行之。作為本發(fā)明的一個實施例,對于分支版本逃逸算法,還需要在每個標記過的同步方法調(diào)用點之前插入一條標記指令mark(),并將^皮標記過的每個同步方法編譯成分支版本的本地代碼。需要注意的是,本發(fā)明所提出的同步方法優(yōu)化框架非常靈活,它的前兩個階段均可以分別采取不同的策略,每個階段選擇不同策略可以組合成不同的優(yōu)化算法。可以根據(jù)不同的應(yīng)用需求,使用不同的組合。除了高度的靈活性之外,該框架還具有另一個優(yōu)點,那就是良好的可可以采用其他的策略,只要該策略能識別出無須同步的同步方法調(diào)用點,都可以作為該同步方法優(yōu)化框架的第一階段。同步方法優(yōu)化框架的程序分析階段每增加一種新的策略,就可以用這種策略與編譯階段的2種策略分別進行組合,從而生成新的優(yōu)化算法。作為本發(fā)明的一個實施例,可以在開源的JavaSE平臺ApacheHarmony上,用。++實現(xiàn)雙版本粗化算法和分支版本粗化算法,下面分別舉例介紹這兩個算法的實現(xiàn)。雙版本粗化算法指在同步方法優(yōu)化框架的程序分析階段采用鎖粗化技術(shù),編譯階段釆用雙版本策略的算法,該算法包括兩個部分1)利用Harmony的即時編譯器對每個被編譯方法的CFG進行程序分析和變換,該過程的算法描述如下輸入當前凈皮編譯的方法的CFG輸出變換后的CFG過程包括程序分析和代碼變換兩個階段,其基本框架如下doubleOptimizationO{programAnalyse();〃程序分析transformO;〃代碼變換如圖3所示為根據(jù)本發(fā)明的一個實施例的雙版本算法的示意圖。其中O.syncCall()指令是對該同步方法的普通版本的本地代碼的調(diào)用,O.Call()指令是對非同步版本的本地代碼的調(diào)用。以圖3展示的偽CFG(即圖中的節(jié)點未必是嚴格的基本塊節(jié)點)為例對其進行簡單描述。programAnalyse():利用JIT對當前被編譯方法的中間表示進行程序分析,找到作用于同一個同步對象上的相鄰同步方法調(diào)用點,如圖3中的O.syncCalll()、0早cCall2()和0早cCal13(),以及同步操作,如圖3中的lock(O)和imlock(O)。transform():根據(jù)找到的這些同步方法調(diào)用點和同步操作對當前被編譯方法的中間表示進行代碼變換,其具體過程如下(a)找到這些相鄰的同步方法調(diào)用點與同步操作中的第一個,如圖3中的O.syncCalll(),在它之前插入lock(O)指令;找到這些相鄰的同步方法調(diào)用點與同步#:作中的最后一個,如圖3中的0.syncCal13(),在它之后插入unlock(O)指令。(b)標記在programAnalyse()中找到的這些同步方法調(diào)用點,如圖3中的O.syncCalll()、0,syncCall2()和0.syncCall3();刪除在programAnalyse()中找到的這些同步操作,如圖3中的lock(O)和unlock(O)。(c)對于在代碼變換之前不在同步區(qū)域中、但在代碼變換之后被包含到同步區(qū)域中的基本塊,如圖3中的基本塊D,如果在代碼變換之后,存在從不在同步區(qū)域中的基本塊到該基本塊的控制流邊,如圖3中從基本塊C到基本塊D的控制流邊,則需要在該邊上插入lock(O)指令;如果在代碼變換之后,存在從該基本塊到不在同步區(qū)域中的基本塊的控制流邊,如圖3中從基本塊D到基本塊E的控制流邊,需要在該邊上插入unlock(O)指令。(d)修改編譯流水線及虛擬機內(nèi)核VMCore。當執(zhí)行到一個同步方法調(diào)用點時,如果該調(diào)用點未#:標記,則執(zhí)行其普通片反本的本地代碼,然后#1行之;如果該調(diào)用點被標記,如圖3中的O.syncCalll()、0.syncCall2()和0.syncCal13(),則執(zhí)行其非同步版本的本地代碼,如圖3中的O.Calll()、0.Call2()和O.CaU3()。作為本發(fā)明的一個實施例,分支版本粗化算法指在同步方法優(yōu)化框架的程序分析階段采用鎖粗化技術(shù),編譯階段采用分支版本策略的算法,其算法描述如下輸入當前被編譯的方法的CFG輸出變換后的CFG過程包括程序分析、代碼變換以及分支變換三個階段,其基本框架如下branchOptimization(){programAnalyse();〃禾呈序分析transform();〃代碼變換branchO;/Z分支變換如圖4所示為根據(jù)本發(fā)明的一個實施例的分支版本算法的示意圖。其中O.syncCall()指令是對該同步方法普通版本本地代碼的調(diào)用,O.brCall()指令是對分支版本本地代碼的調(diào)用。下面以圖4展示的偽CFG為例進行簡單描述。programAnalyse():利用JIT對當前被編譯方法的中間表示進行程序分析,找到作用于同一個同步對象上的相鄰同步方法調(diào)用點,如圖4中的O.syncCalll()、0.syncCall2()和0.syncCal13(),以及同步才喿作,如圖4中的lock(O)和unlock(O)。transform():根據(jù)找到的這些同步方法調(diào)用點和同步操作對當前被編譯方法的中間表示進行代碼變換,其具體過程如下(a)找到這些相鄰的同步方法調(diào)用點與同步操作中的第一個,如圖4中的O.syncCalll(),在它之前插入lock(O)指令;找到這些相鄰的同步方法調(diào)用點與同步操作中的最后一個,如圖4中的O.syncCalB(),在它之后插入unlock(O)指令。(b)在programAnalyse()中找到的這些同步方法調(diào)用點之前插入一條標記指令mark(),如圖4中的O.syncCalll()、0.syncCall2()和0.syncCal13(),刪除在programAnalyse()中找到的這些同步操作,如圖4中的lock(O)和unlock(O)。(c)對于在代碼變換之前不在同步區(qū)域中、但在代碼變換之后被包含到同步區(qū)域中的基本塊,如圖4中的基本塊D,如果在代碼變換之后,存在從不在同步區(qū)域中的基本塊到該基本塊的控制流邊,如圖4中從基本塊C到基本塊D的控制流邊,需要在該邊上插入lock(O)指令,如果在代碼變換之后,存在從該基本塊到不在同步區(qū)域中的基本塊的控制流邊,如圖4中從基本塊D到基本塊E的控制流邊,需要在該邊上插入unlock(O)指令。branch():如果當前被編_澤方法是同步方法,將其變換成分支版本,其具體過程如下(a)在方法入口處插入一條獲得標記信息的指令和一條清除標記的指令,如圖4中入口塊中的marked-getMark()與clearMark()指令。(b)對于作用在該方法的同步對象上的同步才喿作,如圖4中的lock(Ol)和unlock(Ol),在其之前插入一條分支指令,該分支指令判斷獲得的標記信息marked是否為真,若為真,則跳轉(zhuǎn)到該同步操作之后,否則,執(zhí)行該同步操作。需要注意的是,作為本發(fā)明的一個實施例,無論是雙版本粗化算法還是分支版本粗化算法,如果作用于同一個同步對象上的相鄰同步方法調(diào)用點和同步操作之間滿足上述的條件15之一,則不能進行優(yōu)化。如圖3及圖4中的基本塊A、B和D,如果滿足上述條件1~5中的任何一條,都不能進行優(yōu)化。如圖5所示為根據(jù)本發(fā)明的一個實施例的同步優(yōu)化設(shè)備的示意圖。如圖所示,該同步優(yōu)化設(shè)備包括分析模塊、編譯模塊和執(zhí)行模塊。其中,分析模塊用于對被編譯方法進行靜態(tài)程序分析,根據(jù)分析結(jié)果確定被編譯方法中在同步對象上存在無須同步的同步方法調(diào)用點,并對該同步方法調(diào)用點進行標記。編譯模塊用于根據(jù)標記的同步方法調(diào)用點為同步方法編譯生成允許不對所述同步方法的同步對象執(zhí)行同步操作的本地代碼。執(zhí)行模塊用于根據(jù)標記的同步方法調(diào)用點執(zhí)行所述本地代碼。本發(fā)明提出的同步方法優(yōu)化方法及設(shè)備主要有以下三個優(yōu)點18第一,本發(fā)明的同步方法優(yōu)化方法及設(shè)備具有高度的靈活,可以根據(jù)不同的需求,自由組合各階段的不同策略,生成不同的優(yōu)化算法。一種程序分析方法能識別出無須同步的同步方法調(diào)用點,就可以將其應(yīng)用于該同步方法優(yōu)化框架的第一階段。第三,在本發(fā)明的同步方法優(yōu)化方法及設(shè)備的基礎(chǔ)上設(shè)計的優(yōu)化算法是過程間的同步優(yōu)化算法,不僅能刪除大量過程內(nèi)同步算法無法刪除的同步操作,而且能用過程內(nèi)同步優(yōu)化算法的開銷獲得接近過程間算法的優(yōu)化效果,緩解了開銷和優(yōu)化效果之間的矛盾。發(fā)明人在開源的JavaSE平臺ApacheHarmony上,基于該同步方法優(yōu)化框架實現(xiàn)了雙版本粗化算法和分支版本粗化算法,該框架可以同樣地應(yīng)用在其他Java虛擬機上。發(fā)明人以SPECjbb2005作為測試程序?qū)ν椒椒▋?yōu)化算法的實現(xiàn)進行了測試。表1給出了SPECjbb2005中各種同步操作的數(shù)量,其中靜態(tài)和動態(tài)分聯(lián)(inline)前和內(nèi)聯(lián)后分別表示執(zhí)行方法內(nèi)聯(lián)前后SPECjbb2005中各種同步操作的數(shù)量。靜態(tài)編譯時分析只對應(yīng)用程序中的每個方法分析一次,它不能準確反映程序在實際運行時執(zhí)行的各種同步操作數(shù)量,但能反映出SPECjbb2005中靜態(tài)存在的可優(yōu)化的機會有多少;而動態(tài)運行時分析所收集、統(tǒng)計的信息(動態(tài)列)能準確反映程序在實際運行時執(zhí)行的各種同步操作數(shù)量,從而能準確反映出同步優(yōu)化算法對整個程序性能的影響。表中的Locks表示戶斤有monitorenter的凄史量,Unlocks表示戶斤有monitorexit的凌史量,insertedLocks表示采用鎖并且4b4支術(shù)時4翁入的monitorenter的凄t量,insertedUnlocks表示采用鎖相X匕4支術(shù)時插入的monitorexit的凄史量,removedLocks表示優(yōu)化算法刪除掉的monitorenter的數(shù)量,removedUnlocks表示優(yōu)化算法刪除掉的monitorexit的數(shù)量,Sync-Methods是所有同步方法的數(shù)量,opt數(shù)量。對于靜態(tài)信息而言,syncmethodCallsites表示所有同步方法調(diào)用點的數(shù)量,optsyncmethodsCallsites表示在同步方法優(yōu)化算法中所有被標記過的同步方法調(diào)用點的數(shù)量,即被優(yōu)化的同步方法調(diào)用點的數(shù)量。對于動態(tài)信息而言,syncmethodCallsites表示同步方法^皮執(zhí)行的總次數(shù),optsyncmethodsCallsites表示所有被優(yōu)化的同步方法調(diào)用點被執(zhí)行的總次數(shù)。表1SPECjbb2005中各種同步操作的數(shù)量統(tǒng)計<table>tableseeoriginaldocumentpage20</column></row><table>從表1可以看出,在內(nèi)聯(lián)之前只能刪除被標記的同步方法中同步對象上的同步操作,同步方法優(yōu)化算法能刪除61個同步方法中的61個加鎖操作,除此之外不能刪除任何加鎖操作。在內(nèi)聯(lián)之后由于大量的同步方法被內(nèi)聯(lián)到其調(diào)用者的方法中成為同步語句塊,在調(diào)用者方法中便出現(xiàn)了大量可以刪除加鎖操作的機會,從表中的數(shù)據(jù)可以看出,內(nèi)聯(lián)后可以刪除431個加鎖操作,其中包含29個同步方法中的29個加鎖操作。從表1中的靜態(tài)信息可以看出,不管是在內(nèi)聯(lián)前還是內(nèi)聯(lián)后,被優(yōu)化的同步方法調(diào)用點的數(shù)量都相當大,說明內(nèi)聯(lián)前后都存在大量同步方法優(yōu)化的機會。從表1中的動態(tài)信息可以看出,無論內(nèi)聯(lián)前后,優(yōu)化過的同步方法實際被執(zhí)行的次數(shù)都相當之多。因此,無論編譯器是否支持內(nèi)聯(lián),同步方法優(yōu)化算法都能起到較好的優(yōu)化同步方法的效果。從表1中還可以看出,為了保證程序語義不被改變而插入的同步操作的數(shù)量遠小于刪除掉的同步操作的數(shù)量;被優(yōu)化的同步方法的數(shù)量相比同步方法的總數(shù)量要小得多,而且一般情況下同步方法的代碼都非常少,對于雙版本粗化算法意味著保存非同步版本的本地代碼的額外存儲空間開銷會很小。采用雙版本策略為每個需要優(yōu)化的同步方法生成兩個版本的本地代碼,需要一些額外的存儲空間開銷。表2給出了SPECjbb2005在各種情況下所耗費的本地代碼的存儲空間,其中none表示執(zhí)行時不進行方法內(nèi)聯(lián)也不使用雙版本粗化算法時所有本地代碼需要的存4渚空間,none&syncOpt表示執(zhí)4亍時不進4亍方法內(nèi)聯(lián)但使用雙版本粗化算法時所有本地代碼需要的存儲空間。從表中所示的數(shù)據(jù)可以看出,在不使用內(nèi)聯(lián)時雙版本策略產(chǎn)生的額外存儲空間開銷只有83324字節(jié),僅增加約5.6%的存儲空間。表中的inline表示進行方法內(nèi)聯(lián)但不使用雙版本粗化算法時所有本地代碼需要的存儲空間,inline&syncOpt表示進行方法內(nèi)聯(lián)而且使用雙版本粗化算法時所有本地代碼需要的存儲空間,/人表中所示的數(shù)據(jù)可以看出,在使用方法內(nèi)聯(lián)時雙版本策略產(chǎn)生的額外存儲空間開銷只有l(wèi)""8字節(jié),僅增加約7.5%的存儲空間。由此可見,雙版本策略對SPECjbb2005產(chǎn)生的額外存儲開銷不大。假使針對一些應(yīng)用程序,雙版本算法會產(chǎn)生非常大的額外存儲空間開銷,則可以考慮用分支版本策略。內(nèi)聯(lián)前內(nèi)聯(lián)后nonsnone&syncOpt增加率inlineinline&syncOpt增加率147681115601355.6%152138816358167.5%l試,實驗使用的平臺為Intel(R)Core(TM)2QuadCPUQ6600@2.40GHz,3GB內(nèi)存,操作系統(tǒng)為WindowsXP,部分測試結(jié)果如圖6和圖7所示。圖6為根據(jù)本發(fā)明的一個實施例的3種不使用方法內(nèi)聯(lián)的Java虛擬機#丸4亍SPECjbb2005所4尋的吞吐量(bops:businessoperationpersecond)只于比示意圖。其中,none表示執(zhí)行時未應(yīng)用任何同步優(yōu)化,branch表示執(zhí)行時應(yīng)用分支版本粗化同步優(yōu)化算法,double表示執(zhí)行時應(yīng)用雙版本粗化同步優(yōu)化算法,improvementl和improvement2分另'J表示branch相只于于none、double相對于none的吞吐量提高率。圖中數(shù)據(jù)表的第1~3行分別為使用未應(yīng)用任何同步優(yōu)化的虛擬機(記為none)、應(yīng)用分支版本粗化算法的虛21擬機(記為branch)、應(yīng)用雙版本粗化算法的虛擬機(記為double)執(zhí)行SPECjbb2005的6組測試結(jié)果。數(shù)據(jù)表中的后24亍分別為branch相對于none、double相對于none的吞吐量提高率。由于Stoodley等的過程內(nèi)鎖粗化算法在不使用方法內(nèi)聯(lián)時幾乎對同步無改進,故這里未與之對比。從圖6中可見,分支版本粗化算法和雙版本粗化算法均能改進SPECjbb2005的吞吐量,而雙版本粗化算法對吞吐量的提高率比分支版本粗化算法的要高些,這是因為分支版本粗化算法會在一些同步方法中加入判斷是否需要執(zhí)行同步操作的分支指令,這些分支指令將耗用運行時間,從而影響吞吐量的改進。不過,雙版本粗化算法的較高性能改進是以更多的編譯時開銷和存儲開銷為代價的。圖7為根據(jù)本發(fā)明的一個實施例的4種使用方法內(nèi)聯(lián)的Java虛擬機執(zhí)行SPECjbb2005所得的吞吐量對比示意圖,其中,inline表示執(zhí)行時未應(yīng)用任何同步優(yōu)化,inline&Stoodley表示執(zhí)行時應(yīng)用了Stoodley等的同步優(yōu)化算法,inline&branch表示執(zhí)行時應(yīng)用分支版本粗化同步優(yōu)化算法,inline&double表示執(zhí)行時應(yīng)用雙版本粗化同步優(yōu)化算法的測試結(jié)果,improvement1、improvement2、improvement3分另'J表示inline&Stoodley相對于inline、inline&branch相對于inline、inline&double相對于inline的吞吐量提高率。圖中數(shù)據(jù)表的第14行分別為使用應(yīng)用方法內(nèi)聯(lián)但未應(yīng)用任何同步優(yōu)化的虛擬機(記為inline)、在內(nèi)聯(lián)后應(yīng)用Stoodley等的粗化算法的虛擬機(記為inline&Stoodley)、在內(nèi)聯(lián)后應(yīng)用分支版本粗化算法的虛擬機(記為inline&branch)、在內(nèi)耳關(guān)后應(yīng)用雙版本粗化算法的虛擬才幾(記為inline&double)執(zhí)行SPECjbb2005的6組測試結(jié)果。數(shù)據(jù)表中的后3行分另'J為inline&Stoodley相對于inline、inline&bmnch相對于inline、inline&double相對于inline的吞吐量提高率。從中可見,三種同步優(yōu)化算法都能改進吞吐量,而雙版本粗化算法和分支版本粗化算法所帶來的改進高于Stoodley等的算法所帶來的改進。從表1中可知,在內(nèi)聯(lián)后同步方法調(diào)用的執(zhí)行次數(shù)由612136827減到87182262,這是由于在執(zhí)行了內(nèi)耳關(guān)后絕大多數(shù)同步方法調(diào)用點被替換成這些同步方法的方法體。另外,由于在內(nèi)聯(lián)后應(yīng)用分支版本粗化算法所產(chǎn)生的判斷是否需要執(zhí)行同步操作的分支指令數(shù)顯著減少了,故分支版本粗化算法所帶來的分支指令對性能的影響也減輕了。從圖7中可以看到,inline&branch和inline&double對吞吐量的提高率是差不多的。由圖6和圖7中分支版本粗化算法和雙版本粗化算法對吞吐量的改進情況可知,兩種算法在內(nèi)聯(lián)后的改進比對應(yīng)的內(nèi)聯(lián)前的改進都要高。這主要是因為當不執(zhí)行內(nèi)聯(lián)時,鎖粗化算法形成的新的同步區(qū)域會包含方法調(diào)用和返回、甚至是對未編譯過的同步方法的編譯等操作,這些操作導致新的同步區(qū)域較長,從而嚴重影響多線程程序的并發(fā)性。在內(nèi)耳關(guān)后,由于大部分同步方法調(diào)用點被替換成同步方法的方法體,故鎖粗化算法形成的新的同步區(qū)域中的方法調(diào)用和返回以及對未編譯過的同步方法的編譯等操作顯著減少了,從而新的同步區(qū)域相對較短,并發(fā)性將得到改善。盡管已經(jīng)示出和描述了本發(fā)明的實施例,對于本領(lǐng)域的普通技術(shù)人員而言,可以理解在不脫離本發(fā)明的原理和精神的情況下可以對這些實施例進行多種變化、修改、替換和變型,本發(fā)明的范圍由所附權(quán)利要求及其等同限定。權(quán)利要求1、一種同步優(yōu)化方法,其特征在于,包括以下步驟對被編譯方法進行靜態(tài)程序分析,根據(jù)分析結(jié)果確定所述被編譯方法中無須對同步對象進行同步操作的同步方法調(diào)用點,并對所述同步方法調(diào)用點進行標記;根據(jù)所述標記的同步方法調(diào)用點為其調(diào)用的同步方法編譯生成允許不對所述同步方法的同步對象執(zhí)行同步操作的本地代碼;根據(jù)所述標記的同步方法調(diào)用點執(zhí)行所述本地代碼。2、根據(jù)權(quán)利要求1所述的同步優(yōu)化方法,其特征在于,所述對被編譯方法進行靜態(tài)程序分析,確定無須對同步對象進行同步操作的同步方法調(diào)用點的步驟包括合并作用于同一個同步對象上的相鄰同步區(qū)域和/或嵌套同步區(qū)域,將包含在所述合并后的同步區(qū)域內(nèi)的同步方法調(diào)用點確定為所述無須對同步對象進行同步操作的同步方法調(diào)用點。3、根據(jù)權(quán)利要求1所述的同步優(yōu)化方法,其特征在于,所述對被編譯方法進行靜態(tài)程序分析,確定無須對同步對象進行同步操作的同步方法調(diào)用點的步驟包括根據(jù)對象是否在多個線程間共享確定對所述對象的同步方法調(diào)用點是否是無須對同步對象進行同步操作的同步方法調(diào)用點。4、根據(jù)權(quán)利要求3所述的同步優(yōu)化方法,其特征在于,根據(jù)對象是否在多個線程間共享確定對所述對象的同步方法調(diào)用點是否是無須對同步對象進行同步操作的同步方法調(diào)用點的步驟包括如果所述對象只在創(chuàng)建所述對象的線程中被訪問,則將作用于所述對象的同步方法調(diào)用點確定為所述無須對同步對象進行同步操作的同步方法調(diào)用點。5、根據(jù)權(quán)利要求1所述的同步優(yōu)化方法,其特征在于,4艮據(jù)所述標記同步對象執(zhí)行同步操作的本地代碼的步驟包括根據(jù)所述標記的同步方法調(diào)用點為所述同步方法編譯生成所述同步方法的普通版本和所述同步方法的非同步版本,上的同步操作而生成的本地代碼。6、根據(jù)權(quán)利要求1所述的同步優(yōu)化方法,其特征在于,根據(jù)所述標記同步對象執(zhí)行同步操作的本地代碼的步驟包括根據(jù)所述標記的同步方法調(diào)用點為所述同步方法編譯生成所述同步方法的分支版本,并在所述被標記的同步方法調(diào)用點前插入一條設(shè)置標記信息的指令,口處插入獲得標記信息的指令和清除標記的指令;在作用在所述同步方法的同步對象上的同步操作之前插入分支指令,所述分支指令判斷獲得的標記信息,若所述標記信息為真,則跳轉(zhuǎn)到所述同步操作之后,如果所述標記信息為假,則執(zhí)行所述同步操作。7、根據(jù)權(quán)利要求5所述的同步優(yōu)化方法,其特征在于,執(zhí)行所述本地代碼的步驟包括當執(zhí)行同步方法調(diào)用點時,如果所述同步方法調(diào)用點為標記的同步方法調(diào)用點,則調(diào)用所述非同步版本的本地代碼,如果所述同步方法調(diào)用點為沒有標記的同步方法調(diào)用點,則調(diào)用所述普通版本的本地^C碼。8、根據(jù)權(quán)利要求6所述的同步優(yōu)化方法,其特征在于,執(zhí)行所述本地代碼的步驟包括當執(zhí)行到同步方法調(diào)用點時,根據(jù)所述同步方法調(diào)用點前設(shè)置的標記信息指令調(diào)用所述分支版本的本地代碼。9、根據(jù)權(quán)利要求1所述的同步優(yōu)化方法,其特征在于,對^皮編譯方法進行靜態(tài)程序分析中出現(xiàn)以下情況之一時不進行將同步方法調(diào)用點確定為無須對同步對象進行同步搡作的同步方法調(diào)用點的步驟作用于同一個同步對象上的相鄰同步方法調(diào)用點和同步操作之間包含作用于其他對象上的同步操作;所述作用于同一個同步對象上的相鄰同步方法調(diào)用點和同步操作之間包含訪問易變volatile數(shù)據(jù)的操作;所述作用于同一個同步對象上的相鄰同步方法調(diào)用點和同步操作之間包含靜態(tài)無法解析的訪問或方法調(diào)用;所述作用于同一個同步對象上的相鄰同步方法調(diào)用點和同步操作之間包含循環(huán);所述作用于同一個同步對象上的相鄰同步方法調(diào)用點和同步操作之間包含鎖定次數(shù)不一致的操作,所述鎖定次數(shù)不一致的操作所屬的控制流圖CFG節(jié)點的各個前驅(qū)節(jié)點被鎖定的次數(shù)不同。10、一種同步優(yōu)化設(shè)備,其特征在于,包括分析模塊、編譯模塊和執(zhí)行模塊,其中,所述分析模塊用于對被編譯方法進行靜態(tài)程序分析,根據(jù)分析結(jié)果確定所述被編譯方法中無須對同步對象進行同步操作的同步方法調(diào)用點,并對所述同步方法調(diào)用點進行標記;所述編譯模塊用于根據(jù)所述標記的同步方法調(diào)用點為其調(diào)用的同步方法編譯生成允許不對所述同步方法的同步對象執(zhí)行同步操作的本地代碼;所述執(zhí)行模塊用于根據(jù)所述標記的同步方法調(diào)用點執(zhí)行所述本地代碼。全文摘要本發(fā)明提出了一種同步優(yōu)化方法及設(shè)備。該方法包括以下步驟對被編譯方法進行靜態(tài)程序分析,根據(jù)分析結(jié)果確定所述被編譯方法中無須對同步對象進行同步操作的同步方法調(diào)用點,并對所述同步方法調(diào)用點進行標記;根據(jù)所述標記的同步方法調(diào)用點為其調(diào)用的同步方法編譯生成允許不對所述同步方法的同步對象執(zhí)行同步操作的本地代碼;根據(jù)所述標記的同步方法調(diào)用點執(zhí)行所述本地代碼。本發(fā)明所提出的同步優(yōu)化的方法及設(shè)備具有高度的靈活性和良好的可擴展性。文檔編號G06F9/45GK101630268SQ200910162979公開日2010年1月20日申請日期2009年8月20日優(yōu)先權(quán)日2009年8月20日發(fā)明者史成榮,昱張申請人:中國科學技術(shù)大學