2013-06-18 24 views
4

在Java文檔在網上我發現下面的例子:同步報表和單獨的非同步方法

​​

他們指出:

不同步的語句,就必須是一個獨立的,非同步的方法僅用於調用nameList.add

有人明白他們的意思嗎?

來源可查詢here

+2

我認爲這只是說如果你只能創建同步方法(而不是同步塊),你必須把最後一個語句放在它自己的方法中才能達到相同的粒度。 – assylias

+0

呃,如果'nameList'不是線程安全的,這段代碼不會幫助絲毫... – fge

回答

5

本文首先介紹了同步方法 - 至此,讀者可能會認爲同步的粒度單位是單一方法。

而事實上,如果synchronized塊/報表不存在,上面的例子只能實現爲:

public void addName(String name) { 
    doSyncAdd(name); 
    nameList.add(name); 
} 

private synchronized void doSyncAdd(String name) { 
    lastName = name; 
    nameCount++; 
} 

所以,花樣語句的意思是你可以保持一個需要同步的內嵌相關的代碼。而不是必須聲明一個單獨的方法,它既污染了命名空間又分割了代碼流。 (好吧,分解出的方法是適度的好,但它聽起來更可以選擇。)

2

它試圖描繪同步報表相比同步方法的需要。

如果你想有同步的lastNamenameCount但不是nameList.add()然後同步報表是更好的選擇,更新用。否則,您最終會創建一個同步方法來更新lastName和nameCount,並另一個未同步的方法將名稱添加到列表中。

希望澄清。

4

這意味着您的代碼段可被重寫爲

public void addName(String name) { 
    setName(name) 
    nameList.add(name); 
} 

private synchronized void setName(String name) { 
    lastName = name; 
    nameCount++; 
} 

即作爲synchronized(this)相同一個​​實例(非靜態)方法在​​塊中的代碼可以被移動到一個​​方法並從非同步方法調用。效果將是相同的。