单例模式

  • 饿汉模式
package com.wz.cinema.platform.server.util;

public class DataManager {
   /**
    * 单例模式:整个类在运行中只会有一个实例
    * 既然是在运行中只有一个实例,那么就必须
    * 考虑多线程环境
    *
    * 单例模式分为懒汉模式和饿汉模式
    * 饿汉模式本身就是线程安全的单例
    */
   //饿汉模式(实例开始会初始化)
   private DataManager(){

   }
   private static final DataManager instance = new DataManager();
   public static DataManager getInstance(){
       return instance;
   }
}
  • 懒汉模式
package com.wz.cinema.platform.server.util;

public class DataManager {
    /**
     * 单例模式:整个类在运行中只会有一个实例
     * 既然是在运行中只有一个实例,那么就必须
     * 考虑多线程环境
     *
     * 单例模式分为懒汉模式和饿汉模式
     * 饿汉模式本身就是线程安全的单例
     */
    //懒汉模式没有初始值,第一次用的时候才会赋值
            //考虑多线程并发情况下依然存在多例
    private static volatile DataManager instance;
//    public static DataManager getInstance(){
//        //先判断在赋值
//        if (instance== null){
//            instance = new DataManager();
//        }
//        return instance;
//    }
    //加锁,在方法上家的锁从效率层面来说比较低下】
    //因为整个类只有一个实例,只需要第一个方位的线程将实例创建出来之后
    //后面的线程秩序要拿出实例即可
    //方法上加锁会让抢到锁的线程拿到实例,其他线程都会阻塞
//public synchronized static DataManager getInstance(){
//    //先判断在赋值
//    if (instance== null){
//        instance = new DataManager();
//    }
//    return instance;
//}
    //判断实例为空时才会抢锁,不为空直接返回实例
public  static DataManager getInstance(){
    //先判断在赋值
    if (instance== null){
        synchronized (DataManager.class){
            if (instance == null){
                instance = new DataManager();
            }
        }
    }
    return instance;
}

}

双检锁:double-check-lock

双重检查锁(Double-Check Lock,也称为双重检查锁定)是在单例模式中使用的一种优化技术,用于在多线程环境下延迟初始化实例并保证线程安全。