单例模式的核心思想是,通过私有化构造函数,来控制类实例的创建,从而实现单例的保证
1.懒汉式,实现简单但线程不安全
public class Singleton{
private static Singleton singleton;
private Singleton(){}
public static Singleton getSingleton(){
if(singleton==null){
singleton = new Singleton();
}
return singleton;
}
}
2.懒汉式,线程安全
public class Singleton{
private static Singleton singleton;
private Singleton(){}
public static synchronized Singleton getSingleton(){
if(singleton==null){
singleton = new Singleton();
}
return singleton;
}
}
这种写法,虽然线程安全,但是加锁的范围太大,导致效率低下
3.懒汉模式,线程安全,双重检验加锁
publc class Singleton{
private static Singleton singleton;
private Singleton(){}
if(singleton==null){
synchronized(Singleton.class);
if(singleton==null){
singleton = new Singleton();
}
}
return singleton;
}
此处的第二个 if 判断不能省略,否则当两个及以上线程都进入第一个 if 判断时,有线程被中断,则会创建不止一个实例
4.饿汉模式,线程安全,但会减慢系统初始化的时间
public class Singleton{
private static singleton = new Singleton();
private Singleton(){}
public static Singleton getSingleton(){
return singleton;
}
}
此种方法,是通过静态变量自身的特性来保证的,静态变量的初始化是在,所属类的字节码被虚拟机加载的时候初始化的,所以保证了,在获取时的单例。但会减慢应用程序的启动速度