创建一个单例模式的步骤
1.构造方法私有化
2.自己创建一个唯一实例
3.提供一个静态的公共方法
一、懒汉式单例
/**
* @author My_chen
* @时间2016年
*/
//单例模式之懒汉式
public class Singleton {
//1.构造方法私有化
private Singleton(){};
//2.创建一个唯一实例
private static Singleton single=null;
//3.在方法上加同步
public static Singleton getInstance(){
if(single==null){
single=new Singleton();
}
return single;
}
}
*构造方法私有化避免了类在外部被实例化,但是线程是不安全的,并发情况下 可能会产生多个实例。
实现线程安全的几种方式:
1.在方法上添加sychronized
public static synchronized Singleton getInstance(){
if(single==null){
single=new Singleton();
}
return single;
}
2.双重检查
public static Singleton getInstance(){
//双重检查
if(single==null){
synchronized (Singleton.class) {
if(single==null){
single=new Singleton();
}
}
}
return single;
}
二、饿汉式单例
是指在类创建的同时已经创建好一个静态的对象供外部使用,以后不再改变,所以是线程安全的。
//单例模式之饿汉式
public class Singleton {
//1.构造方法私有化
private Singleton(){};
//2.实例化对象
private static final Singleton single=new Singleton();
//3.提供静态工厂方法
public static Singleton getInstance(){
return single;
}
}
懒汉式和饿汉式区别:
1.从加载时机上:
懒汉式,只有当外部调用getInstance()方法的时候,才会去初始化这个单例;
饿汉式,类一加载,单例初始化就完成了。
2.线程安全上:
懒汉式非线程安全,可以使用sychronized添加到方法上或者使用双重验证;
饿汉式天生就是线程安全的,可以直接用于多线程,不会出现问题。