单例模式(规整版)

单例模式写法有很多 主要考虑到 以下三方面 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;
	 }
	  }
	 

  

原文地址:https://www.cnblogs.com/kukum/p/java_design_singleton.html