设计模式--单例设计模式

来源:互联网 发布:mmd制作软件手机 编辑:程序博客网 时间:2024/06/05 20:13
首先单例设计模式是为了保证我们应用程序中某个类的实例在内存中只存在一份,应用场景;
1有些是出于内存消耗的考虑,比如类中数据量比较大的情况,或者说属性较多.
   如果实例一多,内存消耗就多,影响程序的执行效率.
2:有些是为了不引起程序的混淆,必须保证类的实例只能有一份,比如框架的容器,就那spring容器来说,spring容器必须要是单例的,如果不是单例的,那么也就是说同一个数据在容器中存在着多份,会造成程序的复杂性提高;
实现的思路:1构造函数私有化,将对象的创建权限保留在本类中(反射方式除外)2在本类内部创建静态实例 3给外部提供静态方法获取到该实例;
就实例的创建时机来将分为饿汉式和懒汉式.
饿汉式:就是指实例声明即初始化;这个最好理解;
懒汉式:就是延迟初始化,仅仅当获取的时候将实例进行初始化,这个在多线程环境下容易出现线程安全问题,需要有一定的同步机制进行防止;
主要有1DCL,双重锁机制,用synchronized关键字对对象的初始化进行锁定,保证线程安全问题;
       

public class SingletonsByRWL {
      private static ReadWriteLock rwl = newReentrantReadWriteLock();
      private static SingletonsByRWL instance = null;

      private SingletonsByRWL() {
        };

      public static SingletonsByRWL getInstance();

  rwl.readLock().lock();
  try {
   if (instance== null) {
    rwl.readLock().unlock();
    rwl.writeLock().lock();
    try{
     instance= new SingletonsByRWL();
    }finally {
     rwl.writeLock().unlock();
    }
    rwl.readLock().lock();
   }
   returninstance;
  } finally {
   rwl.readLock().unlock();
  }
 }


          2这里给出一个jdk1.5新特性的读写锁机制实现代码这种方式看起来比较繁琐,在给出一个基于jvm底层的懒加载实现方式:

public class Singleton {
private static Singleton instance;


private Singleton() {

}
private static class InnerSingleton {
public static final Singleton INSTANCE = new Singleton();
}

public static Singleton getInstance() {
return InnerSingleton.INSTANCE;
}
}
基于原理:内部类的加载时机,是仅仅使用到的时候加载,因为内部类也有对应的字节码,内部类被使用到的时候jvm才会加载对应的内部类字节码;
在这里就是仅仅当你调用getInstance方法的时候才加载,并创建Singleton对象;从而做到了懒加载.同时线程安全问题不用考虑,jvm底层提供保证;
这是一种比较优雅的实现单实例的懒加载的方式;
ps:在反射的情况下,private修饰的构造函数可以被暴力反射,从而创建多个对象,如果你要避免这种情况,可以使用SecurityManager机制进行实现,
通常由应用服务器内部的配置实现;
 
0 0
原创粉丝点击