1.懒汉式,线程不安全
这种方式是最基本的实现方式,但是不支持多线程,因为没有加锁synchronized,所以严格意义上它并不算单例模式
public class Singleton{
private static Singleton instance;
private Stingleton(){};
public static Singleton getInstance(){
if(instance==null)
{
instance=new Singleton;
}
return instance;
}
}
2.懒汉式,线程安全
第一次调用才初始化,避免内存浪费,必须加锁才能保证单例,但是加锁会影响效率
ublic class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
3.饿汉式
没有加锁,执行效率会提高,但是类加载时就初始化,浪费内存
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
4.双检锁/双重校验锁
这种方法采用双锁机制,安全且在多线程情况下能保持高性能
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
5.登记式/静态内部类
这种方式能达到双检锁方式一样的功效,但实现更简单,对静态域使用延迟初始化,应使用这种方式而不是双检锁方式;这种方式值使用与静态域情况
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
6.枚举
是实现单例模式的最佳方法,更简洁,自动支持序列化,绝对防止多次实例化.
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}