我不习惯使用同步。以下代码段看起来正确吗?

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;
}

10-08 15:57