23种设计模式(1) java单例模式
23种设计模式第四篇:java单例模式 定义: 单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。 特点: 1、单例类只能有一个实例。 单例模式的要点: 1、私有的构造方法 单例模式根据实例化对象时机的不同分为两种: 一种是饿汉式单例,一种是懒汉式单例。 代码如下: 饿汉式单例 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; } } 单例模式还有一种比较常见的形式:双重锁的形式 public class Singleton{ private static volatile Singleton instance=null; private Singleton(){ //do something } public static Singleton getInstance(){ if(instance==null){ synchronized(SingletonClass.class){ if(instance==null){ instance=new Singleton(); } } } return instance; } } 这个模式将同步内容下方到if内部,提高了执行的效率,不必每次获取对象时都进行同步,只有第一次才同步,创建了以后就没必要了。 这种模式中双重判断加同步的方式,比第一个例子中的效率大大提升,因为如果单层if判断,在服务器允许的情况下,假设有一百个线程,耗费的时间为100*(同步判断时间+if判断时间),而如果双重if判断,100的线程可以同时if判断,理论消耗的时间只有一个if判断的时间。 所以如果面对高并发的情况,而且采用的是懒汉模式,最好的选择就是双重判断加同步的方式。 单例模式的优点: 1、在内存中只有一个对象,节省内存空间。 单例模式的优点: 1、扩展困难,由于getInstance静态函数没有办法生成子类的实例。如果要拓展,只有重写那个类。 适用场景: 由于单例模式的以上优点,所以是编程中用的比较多的一种设计模式。以下为使用单例模式的场景: 单例模式注意事项: 只能使用单例类提供的方法得到单例对象,不要使用反射,否则将会实例化一个新对象。 关于Java中单例模式的一些常见问题: 单例模式的对象长时间不用会被jvm垃圾收集器收集吗 除非人为地断开单例中静态引用到单例对象的联接,否则jvm垃圾收集器是不会回收单例对象的。 在一个jvm中会出现多个单例吗 在分布式系统、多个类加载器、以及序列化的的情况下,会产生多个单例,这一点是无庸置疑的。那么在同一个jvm中,会不会产生单例呢?使用单例提供的getInstance()方法只能得到同一个单例,除非是使用反射方式,将会得到新的单例。 代码如下: Class c = Class.forName(Singleton.class.getName()); Constructor ct = c.getDeclaredConstructor(); ct.setAccessible(true); Singleton singleton = (Singleton)ct.newInstance(); 这样,每次运行都会产生新的单例对象。所以运用单例模式时,一定注意不要使用反射产生新的单例对象。 在getInstance()方法上同步有优势还是仅同步必要的块更优优势? 因为锁定仅仅在创建实例时才有意义,然后其他时候实例仅仅是只读访问的,因此只同步必要的块的性能更优,并且是更好的选择。 单例类可以被继承吗 根据单例实例构造的时机和方式不同,单例模式还可以分成几种。但对于这种通过私有化构造函数,静态方法提供实例的单例类而言,是不支持继承的。 转自:java知音 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |