1.饿汉模式(避免线程安全问题,在声明私有静态变量时,就已经实例化了类,不用考虑线程同步问题,但是不能延时加载):
public class SingletonDemo {
private static SingletonDemo instance=new SingletonDemo();
private SingletonDemo() {}
public static SingletonDemo getInstance() {
return instance;
}
}
2.懒汉模式(线程不安全)
public class SingletonDemo {
private static SingletonDemo instance;
private SingletonDemo() {}
public static SingletonDemo getInstance() {
if(instance==null) {
instance=new SingletonDemo();
}
return instance;
}
}
3.懒汉模式(线程安全)
public class SingletonDemo {
private static SingletonDemo instance;
private SingletonDemo() {}
public static SingletonDemo getInstance() {
synchronized (SingletonDemo.class) {
if(instance==null) {
instance=new SingletonDemo();
}
return instance;
}
}
}
4.静态内部类
第一次加载SingletonDemo类不会加载Singleton类,但是调用getSingleton时,才会加载Singleton,才会初始化singleton。即确保了线程安全,又保证了单例对象的唯一性,延迟了单例的实例化。这是最推荐的方式。
public class SingletonDemo {
private SingletonDemo() {}
public Singleton getSingleton() {
return Singleton.singleton;
}
private static class Singleton {
private final static SingletonDemo singleton=new SingletonDemo();
}
}
5.枚举类实现单例
public enum Singleton {
singleton{
public StringBuffer getStringBuffer() {
return new StringBuffer();
}
}
}
测试枚举实现单例是否正确,结果返回true
public class SingletonTest {
public static void main(String args[]) {
System.out.println(Singleton.singleton==Singleton.singleton);
}
}