JAVA单例模式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设置有问题;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值