单例模式(规整版)
单例模式写法有很多 主要考虑到 以下三方面 1.线程安全 2.不会因为序列化而产生新实例 3.防止反射攻击
之前一直在用饿汉模式,个人推荐枚举,饿汉次之。
单例模式 1、懒汉模式 线程不安全 public class SingleTon { private static SingleTon instance; private SingleTon() { } public static SingleTon getIntence() { if (instance == null) { instance = new SingleTon(); } return instance; } } // 懒汉模式 线程安全 public class SingleTon { private static SingleTon instance; private SingleTon() { } public static synchronized SingleTon getIntence() { if (instance == null) { instance = new SingleTon(); } return instance; } } 2、 饿汉模式 始终有一个实例在内存中 // 饿汉模式 一上来就加载 避免多线程的同步问题 类装载的时候就初始化 public class SingleTon { public static SingleTon instance=new SingleTon(); private SingleTon(){}; public static SingleTon getInstance(){ return instance; } } 3、静态内部类 延时加载调用时候才有实例在内存中 // 静态内部类 保证只有一个线程 类装载的时候不一定初始化 public class SingleTon { private static class MySington{ private static final SingleTon myInstance=new SingleTon(); } private SingleTon(){}; private static SingleTon getinstance(){ return MySington.myInstance; } } 4、枚举 自由序列化 保证单个实例 线程安全 方便使用 public enum EnumSingleTon { INSTANCE; private EnumSingleTon() { } public void sysEnum() { System.out.println("来自枚举"); } } 5、 双层检测锁机制 加强版懒汉模式 public class SingleTon { public static SingleTon getInstance(){ if(instance==null){ // 单层检测 synchronized (SingleTon.class) { // 加锁 if(instance==null){ // 再次检测 instance=new SingleTon(); } } } return instance; } }