2011-08-31 23 views
0

您好,我正在處理線程並實現一些簡單的例子。另外,我知道如何鎖定和使用同步語句,但我看到了一個這樣的例子;使用私有變量鎖定同步塊

private List<Foo> myList = new ArrayList<Foo>(); 
private Map<String,Bar) myMap = new HashMap<String,Bar>(); 

public void put(String s, Bar b) { 
    synchronized(myMap) { 
    myMap.put(s,b); 
    // then some thing that may take a while like a database access or RPC or notifying listeners 
    } 
} 

所以如何以及爲什麼可以是一個變量用作鎖定同步的block_ ?.我總是用這個詞來訪問這個語句。

回答

1

在Java中,每個對象實例都有一個與之關聯的鎖。 您需要一個對象的引用才能執行同步的塊語句。 沒有必要爲同步塊使用相同的對象。你會完美的與此:

private Map<String,Bar) myMap = new HashMap<String,Bar>(); 
private Object lockObj = new Object(); 

public void put(String s, Bar b) { 
    synchronized(lockObj) { 
    myMap.put(s,b); 
    // then some thing that may take a while like a database access or RPC or notifying listeners 
    } 
} 

但現在的技巧,是確保您使用相同的對象,每當你訪問myMap對象。 所以這是一個很好的做法,使用你操作的同一個對象,作爲一個鎖。 這是用來當你想做一個小的同步塊,並不打擾爲它創建一個新的對象..這會爲此工作得很好。 我希望能幫助你理解java的同步方法。

Regards, Tiberiu

+0

好友,這是我最清楚,最容易理解的信息:)。謝謝你的幫助 – quartaela

1

這是一個指向當前對象,但MYMAP也是一個對象,類HashMap中的一個實例,它實現Serializable接口

2

您可以使用不具有弱的身份鎖定任何引用類型一塊代碼。使用指針this是一種慣例。但是否應該使用成員變量取決於您的類的行爲。

例如,如果您有四種方法,其中兩種使用var1,另兩種使用var2。現在,如果您只想根據這些變量同步這些方法,那麼您可以選擇使用變量鎖定而不是this

+0

這對我很有幫助。謝謝:) – quartaela