单例模式是软件开发中最常见的一种模式,我们今天来讨论一下这种模式,从数学和逻辑学的角度来讲,单例模式(singleton)被定义为有且只有一个集合,从java的角度讲,被定义为一个类有且只有一个实例,并且自行实例化并向系统提供访问。常见的构造方法为,饿汉式,懒汉式,以及双重加锁式。
饿汉式构造
public class Singleton1 {
private static final Singleton1 instance = new Singleton1();
private Singleton1(){
}
public static Singleton1 getInstance(){
return instance;
}
}
特点:1.静态的实例变量,初始化
2.私有的构造器
3.静态的访问方法
优点:由于是静态属性,在类加载时就已经加载到堆中,线程安全,访问快捷
缺点:静态属性加载的缺点,如果单例类的构造很耗时,加载很慢。
懒汉式构造
public class Singleton2 {
private static Singleton2 instance=null;
private Singleton2(){
}
public static synchronized Singleton2 getInstance(){
if(instance==null){
instance = new Singleton2();
}
return instance;
}
}
特点:1.静态的变量,未初始化
2.私有的构造器
3.静态同步的访问方法(如果单线程的环境,不同步也可以)
优点:静态属性未初始化,类加载快捷。
缺点:访问有一个判断为空的操作,访问稍慢(基本不影响),因为同步,访问效率低下。
双重加锁式构造
public class Singleton3 {
private static Singleton3 instance=null;
private Singleton3(){
}
public static Singleton3 getInstance(){
if(instance==null){
synchronized(Singleton3.class)
{
if(instance==null){
instance = new Singleton3();
}
}
}
return instance;
}
}
特点:1.静态的变量,未初始化
2.私有的构造器
3.静态同步的访问方法(如果单线程的环境,不同步也可以)
4.双重判断
优点:这个是懒汉式构造的加强版,解决了因为同步,访问低下的问题
缺点:判断带来的效率问题
三种构造方式,建议使用第一种,但是也要根据场景选择。