单例模式的6种写法

java中单例模式是一种常见的设计模式,单例模式的写法有多种,这里主要介绍6种写法:饿汉式单例、懒汉式单例3个、静态内部类,枚举。
  单例模式有以下特点:
  1、单例类只能有一个实例。
  2、单例类必须自己创建自己的唯一实例。
  3、单例类必须给所有其他对象提供这一实例。

一.单例写法
<1>饿汉式单例

//饿汉式单例类.在类初始化时实例化   
public class Singleton {  
    private Singleton() {}  
    private static final Singleton single = new Singleton();  
    //静态工厂方法   
    public static Singleton getInstance() {  
        return single;  
    }  
}  
 
 

    此种方式在类加载的时候就初始化实例,没有达到懒加载的效果,但是,它是线程安全的
    <2>懒汉式1

    public class Singleton {  
        private static Singleton instance;  
        private Singleton (){}  
    
        public static Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
        }  
    }  
     
     

      实现懒加载,不是线程安全的
      <3>懒汉式2(同步方法)

      public class Singleton {  
          private static Singleton instance;  
          private Singleton (){}  
          public static synchronized Singleton getInstance() {  
          if (instance == null) {  
              instance = new Singleton();  
          }  
          return instance;  
          }  
      }  
       
       

        使用同步方法形式,实现懒加载和线程安全,但是效率很低,多数情况下并不需要同步。
        <4>懒加载3(双重校验锁)

        public class Singleton {  
            private static Singleton singleton;  
            private Singleton (){}  
            public static Singleton getSingleton() {  
            if (singleton == null) {  
                synchronized (Singleton.class) {  
                if (singleton == null) {  
                    singleton = new Singleton();  
                }  
                }  
            }  
            return singleton;  
            }  
        }  
         
         

          实现懒加载,线程安全,效率与同步方法形式有提高
          <5>静态内部类

          public class Singleton {  
              private static class SingletonHolder {  
              private static final Singleton INSTANCE = new Singleton();  
              }  
              private Singleton (){}  
              public static final Singleton getInstance() {  
              return SingletonHolder.INSTANCE;  
              }  
          }  
           
           

            这种比懒汉形式要好一些,既实现了线程安全,又避免了同步带来的性能影响。
            <6>枚举形式

            public enum Singleton {  
                INSTANCE;  
                //任意方法,调用时使用INSTANCE.方法名
                public void whateverMethod() {  
                }  
            }  
             
             

              代码少,又实现了线程安全,又可避免反射破坏单例模式。

              总结:还有一种登记式单例,以后学习。没有如果懒加载要求可使用饿汉式。线程安全懒加载使用静态内部类,涉及反序列化创建对象使用枚举。如果使用熟练枚举是个不错的选择,代码很简单。

              二.java反射破坏单例:
              http://blog.csdn.net/lws332969674/article/details/8125893
              参考此链接,是否能保证唯一单例待验证。

              备注:链接中防止破坏单例代码标志位flag设置有问题;

              • 0
                点赞
              • 0
                收藏
                觉得还不错? 一键收藏
              • 0
                评论

              “相关推荐”对你有帮助么?

              • 非常没帮助
              • 没帮助
              • 一般
              • 有帮助
              • 非常有帮助
              提交
              评论
              添加红包

              请填写红包祝福语或标题

              红包个数最小为10个

              红包金额最低5元

              当前余额3.43前往充值 >
              需支付:10.00
              成就一亿技术人!
              领取后你会自动成为博主和红包主的粉丝 规则
              hope_wisdom
              发出的红包
              实付
              使用余额支付
              点击重新获取
              扫码支付
              钱包余额 0

              抵扣说明:

              1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
              2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

              余额充值