标签:pre 任务管理 sans 崩溃 类型 资源 防止 构造函数 任务
通过单例模式能够保证系统中一个类仅仅有一个实例并且该实例易于外界訪问,从而方便对实例个数的控制并节约系统资源。假设希望在系统中某个类的对象仅仅能存在一个,单例模式是最好的解决方式。
因此有时确保系统中某个对象的唯一性即一个类仅仅能有一个实例非常重要。
怎样保证一个类仅仅有一个实例而且这个实例易于被訪问呢?定义一个全局变量能够确保对象随时都能够被訪问,但不能防止我们实例化多个对象。一个更好的解决的方法是让类自身负责保存它的唯一实例。这个类能够保证没有其它实例被创建。而且它能够提供一个訪问该实例的方法。这就是单例模式的模式动机
仅仅有一个实例确实降低内存占用。但是我觉得这不是使用单例模式的理由。
我觉得使用单例模式的时机是当实例存在多个会引起程序逻辑错误的时候。
比方类似有序的号码生成器这种东西,怎么能够同意一个应用上存在多个呢?
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 synchronized Singleton getInstance(){ if(singleton==null){ singleton = new Singleton(); } return singleton; } }可是这样的单例类型在多线程中是不安全。有可能会出现两个INSTANCE,为什么呢?
解决问题的办法是为指示类是否已经实例化的变量提供一个相互排斥锁(详见双重锁单例,尽管这样会减少效率)。
懒汉式适合单线程。多线程情况下假设在创建实例对象时不加上synchronized则会导致对对象的訪问不是线程安全的。
从实现方式来讲他们最大的差别就是懒汉式是延时载入,
他是在须要的时候才创建对象,而饿汉式在载入类时创建实例。
饿汉式无需关注多线程问题、写法简单明了、能用则用。
可是它是载入类时创建实例、所以假设是一个工厂模式、缓存了非常多实例、那么就得考虑效率问题,由于这个类一载入则把全部实例无论用不用一块创建。
懒汉式的长处是延时载入、缺点是应该用同步。
避免对共享资源的多重占用。
能够全局訪问。
适用场景:
创建对象时耗时过多或者耗资源过多,但又经经常使用到的对象。
有状态的工具类对象。
频繁訪问数据库或文件的对象。
以及其它我没用过的全部要求仅仅有一个对象的场景。
单例模式注意事项:
仅仅能使用单例类提供的方法得到单例对象,不要使用反射,否则将会实例化一个新对象。
不要做断开单例类对象与类中静态引用的危急操作。
多线程使用单例使用共享资源时。注意线程安全问题。
public static class Singleton{ private static Singleton instance=null; private Singleton(){ //do something } public static Singleton getInstance(){ if(instance==null){ synchronized(Singleton.class){ if(null==instance){ instance=new Singleton(); } } } return instance; } }(有些朋友搞不懂为什么要推断两次Instance==null。由于在多线程中第一次推断时可能有两个或者多个instance==null。那么在synchronized锁里第一个instance已经new出来了,第二个或者后面进入的假设不推断就会反复new对象出来,所以在里面多一层推断确保Instance实例仅仅有一个)
第二种完美实现的实现既线程安全又延迟载入的模式(Initialization on demand holder)使用静态内部类 演示样例:
Public class Singleton{ Private Singleton(){}; Public static class Singleton1{ Private static final Singleton instance = new Singleton(); } Public static Singleton getInstance(){ Return Singleton1.instance; } }
为什么仅仅须要有一个呢?有人说是为了节约内存,但这仅仅是单例模式带来的一个优点。
仅仅有一个实例确实降低内存占用。但是我觉得这不是使用单例模式的理由。我觉得使用单例模式的时机是当实例存在多个会引起程序逻辑错误的时候。比方类似有序的号码生成器这种东西,怎么能够同意一个应用上存在多个呢?
标签:pre 任务管理 sans 崩溃 类型 资源 防止 构造函数 任务
原文地址:http://www.cnblogs.com/yxysuanfa/p/7081984.html