gpt4 book ai didi

Java 同步 - 我做对了吗?

转载 作者:行者123 更新时间:2023-11-29 06:41:41 25 4
gpt4 key购买 nike

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

public void setNewSessionListener(NewSessionListener newSessionListener) {
if (this.newSessionListener != null)
synchronized (this.newSessionListener) {
this.newSessionListener = newSessionListener;
}
else
this.newSessionListener = newSessionListener;
}

更具体地说,我需要执行 null 检查吗?我有一种直觉,认为该代码存在根本性的错误。

最佳答案

有两个错误。第一个是如果你访问一个需要同步的字段,你总是必须持有相同的锁来访问它。此外,您还必须检查该字段是否为空并写入同一个同步块(synchronized block)中的字段,否则当您向该字段写入内容时,它可能已经不为空。

第二个是最好在不变的东西上同步,换句话说,在静态最终字段或实例本身上。例如,您可以专门为此目的创建一个锁对象:

private static final Object LOCK = new Object();

然后你会写:

synchronized (LOCK) {
if (this.newSessionListener == null) this.newSessionListener = newSessionListener;
}

关于Java 同步 - 我做对了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11181703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com