java设计模式学习—单例模式

来源:互联网 发布:ipad1安装不了软件 编辑:程序博客网 时间:2024/06/18 18:06

单例模式:保证一个类只有一个实例,并提供一个访问该类的全局访问点
类型:创建类模式
单例模式的特点:
1)构造方法私有;
2)指向自己实例的私有静态引用;
3)以自己实例为返回值的静态公有方法;

/*饿汉式:一开始就加载,以空间换时间**/public class Singleton{   /*指向自己的私有静态引用*/    private static Singleton singleton = new Singleton();    /*构造方法私有*/    private Singleton(){};    /*公有的静态方法,返回值为自己的实例*/    public static Singleton getInstance(){         return singleton;     }}/*懒汉式:延迟加载,用到的时候才加载*/public class Singleton{private static Singleton singleton;private Singleton(){};public static Singleton getInstance(){   if(singleton==null){       singleton = new Singleton();    }    return singleton;}/*该懒汉模式非线程安全*/public class Singleton{  private static Singleton singleton;  private Singleton(){}  public static synchronized Singleton getInstance(){       if(singleton==null){          singleton = new Singleton();        }     return singleton;  }}/*该懒汉模式线程安全,但效率低*/public class Singleton{   private volatile static Singleton singleton;   private Singleton(){};   public static synchronized Singleton getInstance(){       if(singleton==null){          synchronized(Singleton.class){              singleton = new Singleton();          }       }       return singleton;   }/*该模式线程安全且效率较高:称作双重检查锁定*/

单例模式中存在的两个问题:
1)、如果单例类由不同的类加载器载入,那么可能存在多个单例类的实例。一些servlet容器对每个servlet使用不同的类装载器,这样的servtlet访问一个单例类,他们就会有各自的实例;
2)如果Singleton实现了Serializable接口,那么这个类就可能被序列化和还原;(序列化是将对象转化为字节序列的过程,反序列化是将字节序列还原成java对象的过程)

原创粉丝点击