我从https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html特定码同步声明片断
public void addName(String name) {
synchronized(this) {
lastName = name;
nameCount++;
}
nameList.add(name);
}
- 下面的代码片段,我认为
nameList.add(name);
还需要在synchronized块,因为名称列表的内容也应该是这样的集合发生,之前的关系。 synchronizedList(列表)。
对此有何看法?
- 而且它也说
在不同步的语句,就必须是用于调用nameList.add的唯一目的一个单独的,非同步的 方法。
我不明白为什么nameList.add应该在单独的非同步方法中,如果没有同步语句。
是的,这有点奇怪。没有更多细节(在文档部分),很难知道。我认为他们所得到的是在锁定时应该小心调用第三方代码,但这不是一个好例子。但是你可以想象一个'List'实现,例如,写入一个RDBMS并等待响应 - 一个潜在的长操作,在此期间你持有该锁。在最坏的情况下,如果List获得一个锁,然后调用一个在你的对象上同步的回调函数,你甚至可能会死锁。 – yshavit