是否需要将同步关键字应用于像这样实现单例模式的类的每个方法?
public class Singleton {
private Singleton(){}
public synchronized static Singleton getInstance()
{
if(instance == null)
instance = new Singleton ();
return instance;
}
public void DoA(){
}
}
由于 Singleton 不公开公共构造函数,并且 getInstance() 方法是同步的,因此不需要同步方法 DoA 和 Singleton 类公开的任何其他公共方法。
这个推理正确吗?
就像任何其他课程一样。它可能需要也可能不需要进一步同步。
考虑以下示例:
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
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)