1.饿汉模式
public class Singleton{
private final static Singleton INSTANCE = new Singleton();
private Singleton(){};
public static Singleton getInstance(){
return INSTANCE;
}
}
饿汉式到单例模式不能实现延迟加载,不管将来用不用始终占据内存。
2.懒汉模式
用双重检验锁来实现。具体见我的另一篇文章:https://blog.csdn.net/yaotai8135/article/details/80324643
3.IODH(Initalization Demand Holder)
class Singleton {
private Singleton() {
}
private static class HolderClass {
private final static Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return HolderClass.instance;
}
public static void main(String args[]) {
Singleton s1, s2;
s1 = Singleton.getInstance();
s2 = Singleton.getInstance();
System.out.println(s1==s2);
}
}
由于静态单例对象没有作为
Singleton
的成员变量直接实例化,因此类加载时不会实例化
Singleton
,第一次调用
getInstance()
时将加载内部类
HolderClass
,在该内部类中定义了一个
static
类型的变量
instance
,此时会首先初始化这个成员变量,由
Java
虚拟机来保证其线程安全性,确保该成员变量只能初始化一次。由于
getInstance()
方法没有任何线程锁定,因此其性能不会造成任何影响。
通过使用IoDH,我们既可以实现延迟加载,又可以保证线程安全,不影响系统性能,不失为一种最好的Java语言单例模式实现方式(其缺点是与编程语言本身的特性相关,很多面向对象语言不支持IoDH)。