标签:
单例模式:保证一个类只有一个实例,并提供了一个全局的访问点。
优点:
1)单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,例如读取配置、产生其它依赖对象时,可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。
2)单例模式可以在系统设置全局的访问点,优化共享资源的访问,例如可以设计一个单例类,负责所有数据表的映射处理。
常见的单例模式实现方式:
主流:
1)饿汉式(线程安全、调用效率高,但是不可以延时加载)
2)懒汉式(线程安全,调用效率不高,但是可以延时加载)
其它:
1)双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题)
2)静态内部类式(线程安全,调用效率高,而且可以延时加载)
3)枚举单例(线程安全,调用效率高,但是不能延时加载)
应用:windows的任务管理器、spring当中的每个Bean默认为单例的还有就是数据库的连接池的设计一般为单例的,数据库连接是一种数据库资源,网站的计数器一般也采取单例模式,方便同步,Servlet编程当中,每个Servlet也是单例的。
实现代码:
1)饿汉式:
package com.Singleton; /** * 测试饿汉式的单例模式 * @author Dell * */ public class SingletonDemo01 { /** * 类初始化时立即加载 * 加载类时是天然的线程安全的 */ private static SingletonDemo01 instance = new SingletonDemo01(); private SingletonDemo01(){ } //方法无需同步,调用效率高 public static SingletonDemo01 getInstance(){ return instance; } }
2)懒汉式:
package com.Singleton; public class SingletonDemo02 { //不在此进行实例化,延迟加载,真正使用时在进行加载 private static SingletonDemo02 instance; //私有化构造器 private SingletonDemo02(){ } //方法同步,调用效率低 public static synchronized SingletonDemo02 getInstance(){ if(instance==null){ instance = new SingletonDemo02(); } return instance; } }
3)静态内部类
package com.Singleton; /** * 静态内部类实现单例模式 * 这种方式线程安全、调用效率高并实现了延时加载 * @author Dell * */ public class SingletonDemo03 { private static class SingletonClassInstance{ private static final SingletonDemo03 instance = new SingletonDemo03(); } public static SingletonDemo03 getInstance(){ return SingletonClassInstance.instance; } private SingletonDemo03(){ } }
4)枚举单例模式
package com.Singleton; /** * 避免了反射和反序列化的漏洞,效率高 * 枚举方式没有延时加载的效果 * @author Dell * */ public enum SingletonDemo04 { //这个枚举元素本身就是单例对象 instance; public void SingletonDemo04(){ } }
测试类:
package com.Singleton; public class Client { public static void main(String[] args) { SingletonDemo01 s1 = SingletonDemo01.getInstance(); SingletonDemo01 s2 = SingletonDemo01.getInstance(); System.out.println(s1); System.out.println(s2); SingletonDemo02 s3 = SingletonDemo02.getInstance(); SingletonDemo02 s4 = SingletonDemo02.getInstance(); System.out.println(s3); System.out.println(s4); SingletonDemo03 s5 = SingletonDemo03.getInstance(); SingletonDemo03 s6 = SingletonDemo03.getInstance(); System.out.println(s5); System.out.println(s6); SingletonDemo04 s7 = SingletonDemo04.instance; SingletonDemo04 s8 = SingletonDemo04.instance; System.out.println(s7); System.out.println(s8); } }
测试结果:
标签:
原文地址:http://www.cnblogs.com/lxk2010012997/p/4797997.html