【发布时间】:2015-04-09 00:53:11
【问题描述】:
当我有一个像上面这样的常见单例模式时:为了节省线程,我可以在监听器列表上同步添加和删除监听器。 但是对每个听众的每次访问都这样做重要吗?例如,是否应该对 setPosition 方法进行同样的思考?
public class Singleton {
private static Singleton instance;
private final List<ChangeListener> listeners = new ArrayList<>();
private int position;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
public int getPosition() {
return position;
}
public void setPosition(int position) {
this.position = position;
for (ChangeListener l : listeners) {
l.do(position);
}
}
public void addChangeListener(ChangeListener listener) {
synchronized (listeners) {
listeners.add(listener);
}
}
public void removeChangeListener(ChangeListener listener) {
synchronized (listeners) {
listeners.remove(listener);
}
}
public interface ChangeListener {
public void do(int a);
}
}
【问题讨论】:
-
如果你的“Singleton”类的构造函数不带任何参数,你可以像这样创建实例: private static final Singleton INSTANCE = new Singleton();并更改,getInstance() { return INSTANCE};
-
就我个人而言,我不会按照您创建的方式创建 Singleton 类,如果您使用某种 DI 并且不会按照我在最后一个 cmment 中描述的方式创建实例会更好。 github.com/google/guice/wiki/Scopes
-
上面的代码只是一个抽象。在我的真实代码中,我通过构造函数对一些最终变量进行了迭代。
标签: java synchronization