/*
饿汉式单例
优点:无须考虑线程安全;从调用速度和反应时间角度来讲,一开始就得以创建,因此要优于懒汉式
缺点:从资源利用效率角度,饿汉式类加载时就创建,利用率低于懒汉式;而且系统的加载时间可能会比较长
*/
public class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
/*
懒汉式单例
优点:从资源利用效率角度要优于饿汉式
缺点:多线程时存在线程安全问题
*/
public class Singleton{
private static Singleton instance = null;
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
/*
懒汉式线程双重检查锁定单例
优点:从资源利用效率角度要优于饿汉式,解决线程安全问题
缺点:实例化时,多个线程同时访问的几率变大,通过双重检查锁定机制进行控制,可能影响到系统一定的性能
*/
public class Singleton{
public volatile static Singleton instance = null;//volatile关键字修饰确保多个线程都能够正确处理,JDK1.5及以上
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){//第一重判定
synchronized(Singleton.class){
if(instance == null){//第二重判定
instance = new Singleton();
}
}
}
return instance;
}
}
/*
一种更好的单例实现方式,结合了饿汉式和懒汉式的优点,被称之为Initialization Demand Holder (IoDH)的技术
既可以实现延迟加载,又可以保证线程安全,不影响系统性能,不失为一种最好的Java语言单例模式实现方式
*/
public class Singleton{
private Singleton(){}
private static class HolderClass{//静态内部类
private final static Singleton instance = new Singleton();
}
public static Singleton getInstance(){
return HolderClass.instance;
}
}