对于这个简单的同步语句:
public void addName(String name) {
synchronized(this) { // line1
lastName = name;
nameCount++;
}
nameList.add(name);
}
似乎两个线程,假设为t1和t2,可以同时调用addName方法,但一旦到达标记为line1的行,只有一个线程能够继续执行,这意味着其他线程将被挂起。这意味着即使nameList放在同步语句之外,也保证了nameList不会被多个线程冲突。
这是真的吗?如果是,那么如果在同步语句之前不需要执行任何操作,以下方法是否有任何区别:
public void addName(String name) {
synchronized(this) { //line1
lastName = name;
nameCount++;
nameList.add(name);
}
}
或者:
public synchronized void addName(String name) {
lastName = name;
nameCount++;
nameList.add(name);
}
我知道这一点确切的内容。
void synchronized add(){
}
等同于:
void add(){
synchronized(this){
}
}
我感到困惑的是,在
addName
的例子中,我认为执行顺序可能像这样:t1:synchronized steatement
t1:nameList.add
t2:synchronized steatement
t2:nameList.add
这意味着在
synchronized语句
和nameList.add
之间,其他线程不会执行变更。因此,在同步块内或外放置nameList.add
没有区别。但实际上,执行情况可能如@JB Nizet的答案所示:t1:synchronized steatement
t2:synchronized steatement
t2:nameList.add
t1:nameList.add
把nameList
放在代码块内外都很重要。