单身单身人士

时间:2011-09-26 23:26:08

标签: java

我在单例数据结构中有一个单例。目前我的实现如下:

public class Singleton {
    private Object embInstance;

    private Singleton() { 
        embInstance = new Object();
    }

    private static class SingletonHolder { 
            public static final Singleton instance = new Singleton();
    }

    public static Singleton getInstance() {
            return SingletonHolder.instance;
    }

    public Object getEmbInstance() {
        return embInstance;
    }

    public Object resetEmbInstance() {
        embInstance = null;
    }

}

我的问题是:

  1. 'private Singleton()'是否必须为空或是否可以在其中添加一些代码?
  2. 这个实现是否与embInstance相关?
  3. 此实现不是对embInstance的延迟加载。如何为embInstance实现线程安全的延迟加载?
  4. 谢谢!

5 个答案:

答案 0 :(得分:2)

  1. 可以将一些代码添加到私有的无参数构造函数中。

  2. 我相信SingletonHolder类只会初始化一次,因此保证实例只分配一次。但是,在Singleton类中,你有不同步的setter和getter,所以你可能在embInstance中遇到一些线程问题。

  3. 线程安全的延迟加载:与延迟加载相同,但在同步块内执行:

    public static Object getInstance() {
        if(embInstance == null) {
            synchronized(Singleton.class) {
                if(embInstance == null) {
                    embInstance = new Singleton();
                }
            }
        }
    
        return embInstance;
    }
    
  4. 请注意,此代码既有效(初始化数据后也不需要同步)和线程安全(初始化发生在同步块内)。

    希望有所帮助。

答案 1 :(得分:1)

synchronized关键字使方法保持线程安全。 getEmbInstance()是进行延迟实例化的标准方法。

public class Singleton {
    private Object embInstance;

    private Singleton() { 
    }

    private static class SingletonHolder { 
            public static final Singleton instance = new Singleton();
    }

    public static Singleton getInstance() {
            return SingletonHolder.instance;
    }

    public synchronized Object getEmbInstance() {
        if (embInstance == null)
            embInstance = new Object();
        return embInstance;
    }

    public synchronized Object resetEmbInstance() {
        embInstance = null;
    }
}

答案 2 :(得分:0)

....呃......那不是过于复杂的事吗?为什么在单身人士中有单身人士?为什么这么多课?

此外,你有一个方法可以将你的单例“重置”为null,但是没有一个方法可以实际实例化一个新单元。

为什么不简单:

public class Singleton {
    private static Singleton instance;

    private Singleton() { }

    public static synchronized Singleton getInstance() {
              if (instance == null)
                     instance = new Singleton(); // The "lazy loading" :p
          return instance;
    }
}

答案 3 :(得分:0)

  1. 不确定,是什么意思。在Singleton构造函数

  2. 中使用代码在语法上是可以接受的
  3. 这本身并不是线程安全的。如果embInstance被多个线程访问,即使它是通过getEmbInstance,它也会受到竞争条件的影响。如果您希望线程安全,则必须使用synchronized来访问它。

  4. 要实现线程安全的延迟加载,您必须拥有一个阻止更改Singleton的锁。您可以使用Singleton的实例将其锁定为:

  5. synchronized(this)

    另外,您不需要SingletonHolder public static Singleton instance类本身就可以Singleton

答案 4 :(得分:0)

public class A {
    A a;
    private A() {}

    synchronized public static A getOb() {
        if (a == null) {
            a = new A();
        }
        return a;
    }
}

您应该在Singleton中使用synchronized来保证线程安全。