簡體   English   中英

同步語句和單獨的非同步方法

[英]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語句的需求。

如果要同步更新lastNamenameCount而不是nameList.add()則使用同步語句是更好的選擇。 否則,您最終將創建一個同步的方法來更新lastName和nameCount,並創建另一個非同步的方法來將名稱添加到列表中。

希望它能澄清。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM