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

use*_*212 4 java methods synchronization

在线Java文档中,我发现了以下示例:

public void addName(String name) {
    synchronized(this) {
        lastName = name;
        nameCount++;
    }
    nameList.add(name);
}
Run Code Online (Sandbox Code Playgroud)

他们说:

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

有人明白他们的意思吗?

来源可以在这里找到.

And*_*yle 5

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

事实上,如果不存在synchronized块/语句,上面的示例只能实现为:

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

private synchronized void doSyncAdd(String name) {
    lastName = name;
    nameCount++;
}
Run Code Online (Sandbox Code Playgroud)

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


Bor*_*der 5

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

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

private synchronized void setName(String name) {
    lastName = name;
    nameCount++;
}
Run Code Online (Sandbox Code Playgroud)

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