一、”两次判断法“(效率依然会有影响)
- public class SingletonTest
- {
- private static SingletonTest singletonTest = null;
- private static Object syncObj = new Object();
- private SingletonTest()
- {
- }
- public static SingletonTest getInstance()
- {
- if (null == singletonTest) //第一次判断
- {
- synchronized (syncObj)
- {
- if (null == singletonTest) //第二次判断
- {
- singletonTest = new SingletonTest();
- }
- }
- }
- return singletonTest;
- }
- }
结论:
(1)这样会使得当第一次判断为false的时候,不进入同步块,使得效率比原方法高。
(2)但是:两次判断,使得代码复杂易错,不是很推荐。
二、”静态成员变量法“
- public class SingletonTest
- {
- //在类里面实例化静态成员变量
- private static SingletonTest singletonTest = new SingletonTest();
- private SingletonTest()
- {
- }
- public static SingletonTest getInstance()
- {
- return singletonTest;
- }
- }
结论:
(1)使用类的构造方法时初始化静态变量,创建唯一的静态实例。
(2)简洁,效率高!(无锁)
(3)但是:因为只要使用SingletonTest类,默认创建实例(不管需不需要这个实例)。这种默认创建实例,会导致内存使用效率的降低!
三、”按需创建“方法
- public class SingletonTest
- {
- private SingletonTest()
- {
- }
- private static class Inner //私有的静态内部类
- {
- static SingletonTest singletonTest = new SingletonTest();
- }
- public static SingletonTest getInstance()
- {
- return Inner.singletonTest;
- }
- }
结论:
(1)私有的静态内部类,当不调用getInstance()方法时,就不会调用这个内部类,就不会产生实例。
(2)没有使用锁,没有产生无用的实例。确实是最好的方法。
附原文地址:http://770736680.iteye.com/blog/2036707