5

在在线 Java 文档中,我找到了以下示例:

public void addName(String name) {
    synchronized(this) {
        lastName = name;
        nameCount++;
    }
    nameList.add(name);
}

他们说:

如果没有同步语句,则必须有一个单独的、非同步的方法来调用nameList.add.

有人明白他们的意思吗?

来源可以在这里找到。

4

3 回答 3

5

文章首先介绍了同步方法——所以到此为止,读者可能会认为同步的粒度单位是单个方法。

事实上,如果同步块/语句不存在,上面的示例只能完成为:

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

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

因此,同步语句意味着您可以将需要同步的相关代码内联。而不是必须声明一个单独的方法,这既污染了命名空间又使代码流碎片化。(嗯,分解出方法是适度的,但有选择会更好。)

于 2013-06-18T16:04:03.707 回答
5

这意味着您的代码片段可以重写为

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

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

即与实例(非静态)方法synchronized(this)相同,块中的代码可以移动到方法并从非同步方法调用。效果将是相同的。synchronizedsynchronizedsynchronized

于 2013-06-18T16:04:09.937 回答
2

它试图描述Synchronized statementsSynchronized methods相比的需求。

如果您想要同步更新lastNamenameCount不是同步更新,nameList.add()那么 Synchronized statements是更好的选择。否则,您最终将创建一个同步方法来更新 lastName 和 nameCount,并创建另一个非同步方法来将名称添加到列表中。

希望它澄清。

于 2013-06-18T16:04:06.143 回答