【问题标题】:Make singleton observer pattern synchronized?使单例观察者模式同步?
【发布时间】: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


【解决方案1】:

另一种方法是使用java.util.concurrent.CopyOnWriteArrayList 之类的东西。这是线程安全的,但通过每次写入列表时获取一个副本来实现这一点。乍一看,这可能看起来很昂贵,但通常您会不频繁地添加/删除侦听器并遍历列表以更频繁地调用侦听器。以这种方式使用时,通常比使用显式同步更有效。

【讨论】:

    【解决方案2】:

    我肯定会让 setPosition 方法同步,只是因为在迭代时更改集合不是一个好主意:

    for (ChangeListener l : listeners) {
        l.do(position);
    }
    

    欲了解更多信息,请查看here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-20
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多