[英]ConcurrentModificationException with synchronized and unsynchronized methods
[英]Synchronized statements and separate unsynchronized methods
在Java在線文檔中,我找到了以下示例:
public void addName(String name) {
synchronized(this) {
lastName = name;
nameCount++;
}
nameList.add(name);
}
他們說:
如果沒有同步的語句,則僅出於調用
nameList.add
目的,就必須有一個單獨的,非同步的方法。
有人明白他們的意思嗎?
來源可以在這里找到。
本文首先介紹了同步方法-到目前為止,讀者可能會認為同步粒度單位是單個方法。
實際上,如果不存在同步的塊/語句,則上面的示例只能通過以下方式實現:
public void addName(String name) {
doSyncAdd(name);
nameList.add(name);
}
private synchronized void doSyncAdd(String name) {
lastName = name;
nameCount++;
}
因此,同步語句意味着您可以保留需要內聯的相關代碼。 不必聲明單獨的方法,這既會污染名稱空間,又會碎片化代碼流。 (嗯,將方法分解出來是適度的,但是選擇起來更好。)
這意味着您的代碼段可以重寫為
public void addName(String name) {
setName(name)
nameList.add(name);
}
private synchronized void setName(String name) {
lastName = name;
nameCount++;
}
即,由於synchronized(this)
與synchronized
實例(非靜態)方法相同,因此可以將synchronized
塊中的代碼移至synchronized
方法並從非同步方法中調用。 效果將是相同的。
與Synchronized方法相比,它試圖描述對Synchronized語句的需求。
如果要同步更新lastName
和nameCount
而不是nameList.add()
則使用同步語句是更好的選擇。 否則,您最終將創建一個同步的方法來更新lastName和nameCount,並創建另一個非同步的方法來將名稱添加到列表中。
希望它能澄清。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.