前言:在我们的实际应用中,经常会出现整个应用中有且只有一个,比如工具类。连接池,日志,缓存等等。这个时候经常就会考虑用单例设计模式来解决问题。
一.饿汉式单例模式
public class SingleTon{
//私有的构造方法,保证外界不能够创建对象
private SingleTon(){}
//自己创建一个对象,供外界调用
private static SingleTon instance=new SingleTon();
//给外界提供一个获取对象的接口
public static SingleTon getInstance(){
return instance;
}
}
二.懒汉式单例模式
public class SingleTon{
//私有的构造方法,保证外界不能够创建对象
private SingleTon(){}
//自己创建一个对象,共外界调用
private static SingleTon instance;
//给外界提供一个获取对象的接口
public static SingleTon getInstance(){
if(instance==null){
instance=new SingleTon();
}
return instance;
}
}
区别:饿汉式单例模式在类加载的时候速度比较慢,运行的时候速度较快,而且是线程安全的。
懒汉式单例模式在类加载的速度比较快,运行的时候速度较慢,但是线程是不安全的。
三.线程安全的,性能低一点的懒汉式单例模式
public class SingleTon{
//私有的构造方法,保证外界不能够创建对象
private SingleTon(){}
//自己创建一个对象,共外界调用
private static SingleTon instance;
//给外界提供一个获取对象的接口,但是是线程安全的,一次只有一个线程走进去
public static <span style="color:#33ff33;">synchronized</span> SingleTon getInstance(){
if(instance==null){
instance=new SingleTon();
}
return instance;
}
}
四.线程安全带的,性能较高的懒汉式单例模式
public class SingleTon{
//私有的构造方法,保证外界不能够创建对象
private SingleTon(){}
//自己创建一个对象,共外界调用
private static SingleTon instance;
//给外界提供一个获取对象的接口
public static SingleTon getInstance(){
if(instance==null){
//(1)这里可能有另外一个线程进来,所以要同步
<span style="BACKGROUND-COLOR: #33ff33">synchronized(</span><span style="BACKGROUND-COLOR: #f0f0f0"><span style="color:#cc66cc;">SingleTon.class</span><span style="color:#000000;">)</span></span>
//(2)当执行到(1)的时候,当前线程还没有获得锁,而另外一个线程获得锁进来并创建了一个对象,如果我不在同步锁里面再次判断是否为空的话,获得的就不是同一个对象了。
if(<span style="color:#33ff33;">instance==null</span>){
instance=new SingleTon();
}
}
}
return instance;
}