Java 使单例观察者模式同步?

Java 使单例观察者模式同步?,java,synchronization,Java,Synchronization,当我有一个像上面那样的普通单例模式时:为了使其线程保存,我使添加和删除侦听器的访问在侦听器列表上同步化。 但是对每个侦听器的每个访问都这样做很重要吗?例如,设置位置方法是否也应该这样做 public class Singleton { private static Singleton instance; private final List<ChangeListener> listeners = new ArrayList<>(); private

当我有一个像上面那样的普通单例模式时:为了使其线程保存,我使添加和删除侦听器的访问在侦听器列表上同步化。 但是对每个侦听器的每个访问都这样做很重要吗?例如,设置位置方法是否也应该这样做

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);
    }
}
公共类单例{
私有静态单例实例;
私有最终列表侦听器=新的ArrayList();
私人职位;
私人单身人士(){
}
公共静态同步单例getInstance(){
if(实例==null){
instance=newsingleton();
}
返回实例;
}
public int getPosition(){
返回位置;
}
公共无效设置位置(内部位置){
这个位置=位置;
for(ChangeListener l:侦听器){
l、 do(职位);
}
}
公共无效addChangeListener(ChangeListener listener){
已同步(侦听器){
添加(侦听器);
}
}
public void removeChangeListener(ChangeListener listener){
已同步(侦听器){
删除(侦听器);
}
}
公共接口更改侦听器{
公共行政区(INTA);
}
}

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

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

有关更多信息,请看一看

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

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

有关更多信息,请看一看

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

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

有关更多信息,请看一看

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

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

有关更多信息,请查看另一种方法是使用类似
java.util.concurrent.CopyOnWriteArrayList的内容。这是线程安全的,但通过在每次写入列表时复制来实现。乍一看,这似乎很昂贵,但通常情况下,您将不经常添加/删除侦听器,并在列表中迭代以更频繁地调用侦听器。以这种方式使用时,通常比使用显式同步更有效。

另一种方法是使用类似于
java.util.concurrent.CopyOnWriteArrayList的东西。这是线程安全的,但通过在每次写入列表时复制来实现。乍一看,这似乎很昂贵,但通常情况下,您将不经常添加/删除侦听器,并在列表中迭代以更频繁地调用侦听器。以这种方式使用时,通常比使用显式同步更有效。

另一种方法是使用类似于
java.util.concurrent.CopyOnWriteArrayList的东西。这是线程安全的,但通过在每次写入列表时复制来实现。乍一看,这似乎很昂贵,但通常情况下,您将不经常添加/删除侦听器,并在列表中迭代以更频繁地调用侦听器。以这种方式使用时,通常比使用显式同步更有效。

另一种方法是使用类似于
java.util.concurrent.CopyOnWriteArrayList的东西。这是线程安全的,但通过在每次写入列表时复制来实现。乍一看,这似乎很昂贵,但通常情况下,您将不经常添加/删除侦听器,并在列表中迭代以更频繁地调用侦听器。以这种方式使用时,通常比使用显式同步更有效。

如果“Singleton”类的构造函数不采用任何参数,则可以这样创建实例:private static final Singleton instance=new Singleton();和change,getInstance(){return INSTANCE};就我个人而言,我不会像您创建的那样创建一个单例类,如果您使用某种DI,并且不会像我在上一个cmment中描述的那样创建一个实例,那会更好。上面的代码只是一个抽象。在我的实际代码中,我正在通过构造函数对一些最终变量进行初始化。如果“Singleton”类的构造函数不带任何参数,您可以这样创建实例:private static final Singleton instance=new Singleton();和change,getInstance(){return INSTANCE};就我个人而言,我不会像您创建的那样创建一个单例类,如果您使用某种DI,并且不会像我在上一个cmment中描述的那样创建一个实例,那会更好。上面的代码只是一个抽象。在我的实际代码中,我正在通过构造函数对一些最终变量进行初始化。如果“Singleton”类的构造函数不带任何参数,您可以这样创建实例:private static final Singleton instance=new Singleton();和change,getInstance(){return INSTANCE};就我个人而言,我不会像您创建的那样创建一个单例类,如果您使用某种DI,并且不会像我在上一个cmment中描述的那样创建一个实例,那会更好。上面的代码只是一个抽象。在我的实际代码中,我正在通过构造函数对一些最终变量进行初始化。如果“Singleton”类的构造函数不带任何参数,您可以这样创建实例:private static final Singleton instance=new Singleton();和change,getInstance(){return INSTANCE};就我个人而言,我不会像您创建的那样创建一个单例类,如果您使用某种DI,并且不会像我在上一个cmment中描述的那样创建一个实例,那会更好。上面的代码只是一个抽象。在我的实际代码中,我通过构造函数将一些最终变量初始化。