单例模式

在有些系统中,为了减少内存开支、保证数据内容的一致性,对某些类只创建一个惟一的访问点实例,这就是所谓的单例模式。

在计算机系统中,如 Windows 的回收站、打印机的后台处理服务,
在我们javaweb项目中的日志对象、数据库的连接池、配置对象、缓存对象或者持久化对象等常常被设计成单例。

单例模式有 3 个特点:

  1. 单例类只有一个实例对象;
  2. 该单例对象必须由单例类自行创建;
  3. 单例类对外提供一个访问该单例的全局访问点;

懒汉式单例
该模式的特点是类加载时没有生成单例,只有当第一次调用 getlnstance 方法时才去创建这个单例

public class LazySingleton {
	// 保证 instance 在所有线程中同步,禁止指令重排序
   private static volatile LazySingleton instance = null;   
   private LazySingleton(){}    //private 避免类在外部被实例化
   public static synchronized LazySingleton getInstance() {
       //getInstance 方法前加同步
       if (instance==null) {
           instance=new LazySingleton();
       }
       return instance;
   }
   // 双重检查
   public static LazySingleton getInstanceB() {  
       if (instance == null) {    
           synchronized (LazySingleton.class) {    
              if (instance == null) {    
                 instance = new LazySingleton();   
              }    
           }    
       }    
       return instance;   
   } 
}

饿汉式单例
该模式的特点是类一旦加载就创建一个单例,保证在调用 getInstance 方法之前单例已经存在了。所以也就不存在线程安全的问题了

public class HungrySingleton {
   private static final HungrySingleton instance = new HungrySingleton();
   private HungrySingleton(){}
   public static HungrySingleton getInstance()  {
       return instance;
   }
}
posted @ 2019-08-28 23:08  我叫lileeeee  阅读(89)  评论(0)    收藏  举报