我不习惯使用同步。以下代码段看起来正确吗?
public void setNewSessionListener(NewSessionListener newSessionListener) {
if (this.newSessionListener != null)
synchronized (this.newSessionListener) {
this.newSessionListener = newSessionListener;
}
else
this.newSessionListener = newSessionListener;
}
更具体地说,我需要执行空检查吗?我有一种直觉,认为该代码根本存在错误。
最佳答案
有两个错误。第一个是,如果您访问需要同步的字段,则始终必须使用相同的锁来访问它。另外,您还必须检查该字段是否为空,并在同一同步块中写入该字段,因为否则,当您向该字段中写入内容时,该字段可能已经不为空。
第二个是最好同步一个不变的东西,换句话说,在静态的final字段或实例本身上同步。例如,您可以专门为此创建一个锁对象:
private static final Object LOCK = new Object();
然后您将编写:
synchronized (LOCK) {
if (this.newSessionListener == null) this.newSessionListener = newSessionListener;
}