单例模式及其优缺点

来源:互联网 发布:政府数据 编辑:程序博客网 时间:2024/05/11 01:47

单例模式分为饥汉模式和懒汉模式

       在将单例模式的时候我觉得要先做一个对比,我们创建一个类,用普通的方法声明两个对象,输出两个对象的hashcode值,hashcode值不一样说明这两个对象存储在不同的物理空间。如果hashcode一样说明存储在同一个地方。

   

package com.soufun.test;public class A_test {public A_test(){}}
测试类

package com.soufun.test;public class test {/** * @param args */public static void main(String[] args) {A_test a1 = new A_test();A_test a2 = new A_test();System.out.println(a1.hashCode());System.out.println(a2.hashCode());}}
最后输出
1807500377
355165777

这两个对象的hashcode值不一样,说明这两个对象不是同一个。

我们下面再讲单例模式:

1.饥汉模式:

package com.soufun.test;/** * 饥汉模式 * @author user * */public class A_test {//私有构造方法private A_test(){}private static A_test a = new A_test(){};public static A_test getA_test(){return a;}}
测试类
package com.soufun.test;public class test {/** * @param args */public static void main(String[] args) {A_test a1 = A_test.getA_test();A_test a2 = A_test.getA_test();System.out.println(a1.hashCode());System.out.println(a2.hashCode());}}
最后输出
1807500377
1807500377


2.懒汉模式

package com.soufun.test;/** * 懒汉模式 * @author user * */public class A_test {//私有构造方法private A_test(){}private static A_test a = null;public static A_test getA_test(){if(a==null){a = new A_test(); }return a;}}
输出:

355165777
355165777


这样就看出了使用单例模式后,以后所有引用这个对象的都是同一个对象。而不需要处处使用,就处处创建。

饥汉模式是因为我们在不需要使用这个对象的时候,只要加载这个类,它就会创建一个对象,所以叫它饥汉模式;

懒汉模式是因为只有当我们要创建这个对象的时候,它才去创建,所以叫它懒汉模式。可能理解上不太准确啊,请见谅啊。


懒汉模式和饥汉模式的好处对比

饥汉模式的优点与缺点

优点1.线程安全 
2.在类加载的同时已经创建好一个静态对象,调用时反应速度快缺点2.资源效率不高,可能getA_test()永远不会执行到,但执行该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化了
2.加载慢,因为一开始加载的时候就要创建一个实例

懒汉模式的优点与缺点

优点资源利用率高,不执行getA_test()就不会被实例,可以执行该类的其他静态方法。加载时非常快缺点第一次加载时不够快,多线程使用不必要的同步开销大,调用时比较慢。线程不安全。有可能创建多个实例






                          

     


0 0
原创粉丝点击