gpt4 book ai didi

单例模式下的Java同步

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:27:28 27 4
gpt4 key购买 nike

像这样实现单例模式的类的每个方法都需要同步关键字吗?

public class Singleton {

private Singleton(){}

public synchronized static Singleton getInstance()
{
if(instance == null)
instance = new Singleton ();

return instance;
}

public void DoA(){
}
}

由于单例不公开公共(public)构造函数并且 getInstance() 方法是同步的,因此不需要同步方法 DoA 和单例类公开的任何其他公共(public)方法。

这个推理正确吗?

最佳答案

它就像任何其他类一样。它可能需要也可能不需要进一步同步。

考虑以下示例:

public class Singleton {

private Singleton() {}

public synchronized static Singleton getInstance() { ... }

private int counter = 0;

public void addToCounter(int val) {
counter += val;
}
}

如果要从多个线程使用该类,addToCounter() 会出现竞争条件。解决这个问题的一种方法是使 addToCounter() 同步:

  public synchronized void addToCounter(int val) {
count += val;
}

还有其他方法可以解决竞争条件,例如使用 AtomicInteger:

  private final AtomicInteger counter = new AtomicInteger(0);

public void addToCounter(int val) {
counter.addAndGet(val);
}

在这里,我们在不使用 synchronized 的情况下修复了竞争条件。

关于单例模式下的Java同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15930633/

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