在在线 Java 文档中,我找到了以下示例:
public void addName(String name) {
synchronized(this) {
lastName = name;
nameCount++;
}
nameList.add(name);
}
他们说:
如果没有同步语句,则必须有一个单独的、非同步的方法来调用
nameList.add
.
有人明白他们的意思吗?
来源可以在这里找到。
在在线 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 statements与Synchronized methods相比的需求。
如果您想要同步更新lastName
而nameCount
不是同步更新,nameList.add()
那么 Synchronized statements是更好的选择。否则,您最终将创建一个同步方法来更新 lastName 和 nameCount,并创建另一个非同步方法来将名称添加到列表中。
希望它澄清。