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