单例模式(java程序性能优化笔记)
2016-06-01 22:15
555 查看
单例模式是一种对象创建模式,用于生产一个对象的具体实例,他保证系统中一个类只产生一个实例,单例模式的好处:
1、对于频繁使用的对象,可以省略对象创建的时间
2、由于new操作的次数减少,因而对系统内存的使用频率也会降低,减轻GC压力,缩短GC停顿时间
单例模式主要针对于系统的关键组件和被频繁使用的对象,使用它可以有效改善系统的性能。
单例类必须要有:1、private访问级别的构造函数,只有这样才能确保单例不会在系统的其他代码内被实例化;2、instance(实例对象)和getInstance()(获取实例对象的方法)方法必须是static。
单例模式实现方式一:
如:
实现方式二(使用懒加载):
2、在getInstatance()工厂方法中,判断单例是否存在,如果存在直接返回,如不存在则创建;
3、getInstance()方法必须同步,否则在多线程情况下,当线程1正新建实例时,线程2可能判断instance为null,从而导致多个实例被创建。
不足:由于使用同步关键字,因此在多线程情况下,他的时耗远大于第一种单例模式。
实现方式三(使用内部类):
2、此种方式实例创建是在类加载时完成,因此天生对多线程友好,getInstance方法不必使用同步关键字
3、使用内部类方式实现单例,既可以做到延迟加载,也不必使用关键字,是一种比较完善的时间。
1、对于频繁使用的对象,可以省略对象创建的时间
2、由于new操作的次数减少,因而对系统内存的使用频率也会降低,减轻GC压力,缩短GC停顿时间
单例模式主要针对于系统的关键组件和被频繁使用的对象,使用它可以有效改善系统的性能。
单例类必须要有:1、private访问级别的构造函数,只有这样才能确保单例不会在系统的其他代码内被实例化;2、instance(实例对象)和getInstance()(获取实例对象的方法)方法必须是static。
单例模式实现方式一:
public class Singleton01 { private Singleton01(){ System.out.println("singleton is create"); } private static Singleton01 singleton01=new Singleton01(); public static Singleton01 getInstance(){ return singleton01; } }不足:无法对singleton实例做延迟加载,如果这个单例类在系统中还扮演其他角色,那么在任何使用这个单例类的地方都会初始化这个单例类变量
如:
public class Singleton01 { private Singleton01(){ System.out.println("singleton is create"); } private static Singleton01 singleton01=new Singleton01(); public static Singleton01 getInstance(){ return singleton01; } public static void createString(){ System.out.println("createString in Singleton"); } }
public class SingleTonTest { public static void main(String[] args) { Singleton01.createString(); } }
实现方式二(使用懒加载):
public class SingleTon02 { private SingleTon02(){ System.out.println("lazySingleTon is create"); } private static SingleTon02 instance=null; public static synchronized SingleTon02 getInstance(){ if(instance==null){ instance=new SingleTon02(); } return instance; } }说明:1、静态成员变量instance初始值赋予null,保证在系统启动时没有额外的负载;
2、在getInstatance()工厂方法中,判断单例是否存在,如果存在直接返回,如不存在则创建;
3、getInstance()方法必须同步,否则在多线程情况下,当线程1正新建实例时,线程2可能判断instance为null,从而导致多个实例被创建。
不足:由于使用同步关键字,因此在多线程情况下,他的时耗远大于第一种单例模式。
实现方式三(使用内部类):
public class SingleTon03 { private SingleTon03(){ System.out.println("staticSingle is create"); } private static class SingleHolder{ private static SingleTon03 instance=new SingleTon03(); } public static SingleTon03 getInstance(){ return SingleHolder.instance; } }说明:1、单例模式使用内部类来维护到单例的实例,当SingleTon3被加载时,其内部类并不会被初始化,因此单例类被加载jvm时,不会初始化单例类,而当getInstance()方法被调用时,才加载SingleHolder(内部类),从而初始化instance。
2、此种方式实例创建是在类加载时完成,因此天生对多线程友好,getInstance方法不必使用同步关键字
3、使用内部类方式实现单例,既可以做到延迟加载,也不必使用关键字,是一种比较完善的时间。
相关文章推荐
- 小知识点记录
- Java之多线程
- SpringMVC异常处理
- Java基础02——Java语言基础(关键字、标识等)
- 深入学习java并发编程:CountDownLatch、CyclicBarrier
- Java多线程 之 执行器Executor(二)
- 汇率转换(java界面设计程序)
- 共同学习SpringMVC源码--DispatcherServlet(二)
- HashTable vs HashMap
- Java中运用数组的四种排序方法
- Titan java读数据的相关api使用 (初学)
- HashMap VS WeakHashMap
- spring的ioc之Resource
- java线程
- JavaSE基础之查找质数
- 通过Spring Resource接口获取资源
- spring InitializingBean接口
- Spring mvc的生命周期
- springMVC工作原理
- Garbage Collection in java