版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_41751625/article/details/89875409
单例模式的使用场景是全局只有一个实例存在,这样的场景例如日志类,全局计数器,线程池,连接池等。
实现单例模式通常有如下五种方法.
1.懒汉式
public class SingleTon1 { private static SingleTon1 instance=new SingleTon1(); private SingleTon1(){} public static SingleTon1 getInstance(){ return instance; } }
2.饿汉式(会有线程安全问题)
public class SingleTon2 { private static SingleTon2 instance=null; private SingleTon2(){} public static SingleTon2 getInstance(){ if(instance==null){ instance=new SingleTon2(); } return instance; } }
3.DCL(double check lock)双重检查锁
public class SingleTon3 { private static volatile SingleTon3 instance=null; private SingleTon3(){} public static SingleTon3 getInstance(){ if(instance==null){ synchronized (SingleTon3.class){ if(instance==null){ instance=new SingleTon3(); } } } return instance; } }
4.静态内部类的形式
public class SingleTon { private SingleTon(){} private static class SingleTonHolder{ private static SingleTon instance=new SingleTon(); } public static SingleTon getInstance(){ return SingleTonHolder.instance; } }
5.枚举形式
public enum SingleTon4 { INSTANCE; }
懒汉式和饿汉式在反射破坏和反序列化时会出问题,推荐使用枚举来创建单例模式,既简单,又很安全