同步语句和单独的不同步方法

时间:2013-06-18 15:57:27

标签: java methods synchronization

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

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

他们说:

  

如果没有synchronized语句,则必须有一个单独的,不同步的方法,仅用于调用nameList.add

有人明白他们的意思吗?

可以找到来源here

3 个答案:

答案 0 :(得分:5)

本文首先介绍了同步方法 - 到目前为止,读者可能认为同步的粒度单位是单一方法。

事实上,如果不存在synchronized块/语句,上面的例子只能完成:

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

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

因此,synchronized语句意味着您可以保留需要内联同步的相关代码。而不是必须声明一个单独的方法,它既污染命名空间又碎片化代码流。 (好吧,分解方法很适合,但选择更好。)

答案 1 :(得分:4)

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

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

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

即。由于synchronized(this)synchronized实例(非静态)方法相同,synchronized块中的代码可以移动到synchronized方法并从非同步方法调用。效果会一样。

答案 2 :(得分:2)

同步方法相比,它试图描述同步语句的需求。

如果您希望同步更新lastNamenameCount而不是nameList.add(),则同步语句是更好的选择。否则,您最终将创建一个synchronized方法来更新lastName和nameCount,另一个未同步的方法将在列表中添加名称。

希望它澄清。