有这样一种类,它在整个系统中只存在一个实例.[中国这个类,地球这个类]
而保证这个类只有一个实例,是类设计者的责任,而不是类的使用者.
保证只有一个实例:
private constructor.
** 不要实现Cloneable和Serializable接口.
提供一个全局的访问点:
public static access method.
多线程安全?
如果Class的实例化的开销不大,可以在类加载的时候就实例化一次,且仅仅一次)
1.Eager
public class EagerInitialization {
private static Resource resource = new Resource();
public static Resource getResource() {
return resource;
}
static class Resource {}
}
2.Lazy
public class SafeLazyInitialization {
private static Resource resource;
public synchronized static Resource getInstance() {
if (resource == null){
resource = new Resource();
}
return resource;
}
static class Resource {}
}
3.double checked locking singleton ( 仅适用于java 5.0 以上版本)
public class DoubleCheckedLockingSingleton {
//java5.0 修改了内存模型, 可以保证使用volatile 声明的变量对于double checked locking是正确的
private volatile static DoubleCheckedLockingSingleton uniqueInstance;
private DoubleCheckedLockingSingleton() {}
public static DoubleCheckedLockingSingleton getInstance() {
if (uniqueInstance == null) {
synchronized (DoubleCheckedLockingSingleton.class) {
if (uniqueInstance == null) {
// temp = new DoubleCheckedLockingSingleton();
// uniqueInstance = temp; [通过这样会更安全,JVM的原子性保证]
uniqueInstance = new DoubleCheckedLockingSingleton();
}
}
}
return uniqueInstance;
}
}
4.Lazy initialization holder class idiom
public class ResourceFactory {
//增加一个helper类来初始化对象
private static class ResourceHolder {
public static Resource resource = new Resource();
}
public static Resource getResource() {
return ResourceFactory.ResourceHolder.resource;
}
static class Resource {}
}
根据Classloader的原则,一个类在其信息被需要用到的时候才被JVM加载,resource只有在调用getResource的时候才初始化.
Singleton 的扩展:
Singleton 的核心是如何控制用户使用new对一个类的实例化.
N个实例-->对象池.
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kkdelta/archive/2009/02/28/3945472.aspx