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中描述的那样创建一个实例,那会更好。上面的代码只是一个抽象。在我的实际代码中,我通过构造函数将一些最终变量初始化。