以前我就知道单例模式的两种写法,如今经发现那两种是很基础的用法,下面分享一下,各种单例的写法吧,我个人还是比较喜欢用枚举类的方式写单例,优雅简洁,还安全。
Singleton 单例模式
第一种型式,饿汉式,在环境初始化,即JVM开始运行时就生成实例。
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance() {
return Singleton.instance;
}
}
第二种型式,懒汉式,即需要使用时才生成实例,可以减少内存使用。
public class Singleton {
private static Singleton instance = null;
private Singleton(){}
public static Singleton getInstance() {
synchronized (Singleton.class) {
if(null == instance) {
instance = new Singleton();
}
}
return instance;
}
}
这种用了synchronized 传说也会出现逻辑不严密而new出两个实例的情况,所以又出现了一种变式,即双重锁机制,然而这种在苛刻的条件下依旧逻辑不够严密。
public class Singleton {
private static Singleton instance = null;
private Singleton(){}
public static Singleton getInstance() {
if(null == instance) {
synchronized (Singleton.class) {
if(null == instance) {
instance = new Singleton();
}
}
}
return instance;
}
}
第三种形式,枚举形式,也是我现在比较常用的形式。
public enum Singleton {
INSTANCE;
public static Singleton getInstance() {
//do your Logic
// return INSTANCE;
}
}
这种方式除了更简明,还等同于public属性方式。免费提供了序列化机制,即使面对尖端的序列化或者反射攻击,它都提供了坚实的单例。
第四种形式,延迟加载,解决锁的同步问题,并且安全可靠。
public class SingletonFactory {
private static class SingletonHolder {
public static Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
这种方式也是惰性初始化,在真正使用Holder时才初始化,而且因为是静态初始阶段进行的,所以不再需要额外同步。
用这种方法解决延迟加载最合适不过了。
建议使用后两种方式的单例形式,代码看起来也很优雅 (以上示例private 的构造方法别忘记哦)。
这里有一篇文章的测试代码可以说明用第三种方式的坚实性和防止攻击造成单例失效 http://lzh166.javaeye.com/blog/620817
另外,还有用反射等比较钻牛角尖的方法构建单例的形式,以及一些测试,可以看一下这篇分析的文章 http://www.javaeye.com/topic/60179
分享到:
相关推荐
java Singleton单例模式 java Singleton单例模式
此示例展示了Qml 的单例模式(类似全局对象,只生成一次实例,可全局使用) surfsky.cnblogs.com
singleton单例模式1
单例模式 Singleton 单例模式线程安全问题和拓展
Android Singleton单例模式运用详解
c++ singleton单例模式
本文档,是利用C++来实现设计模式中的,单例模式,里面有内容说明和相关实例代码介绍
C# 23种设计模式之单例模式源码
在Java应用中,单例对象能保证在一个...3、有些像交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了,只有使用单例模式,才能保证核心交易服务器独立控制整个流程。 CSDN代码的详细解释。
单例模式的实现,创建,一个文档作为简介
Singleton pattern单例模式应用
设计模式C++学习之单例模式(Singleton)
单例模式(Singleton)的6种实现
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个...
简单的单例模式举例Singleton 分为恶汉式 懒汉式
深入浅出Singleton,详细掌握单例模式
主要介绍了使用设计模式中的Singleton单例模式来开发iOS应用程序的例子,示例代码为传统的Objective-C语言,需要的朋友可以参考下
在Unity中实现单例模式的最佳方法。 通过使用这种模式,您将能够定义Global变量和类,并在Global中使用它们的方法和属性。 对于使用Unity引擎制作的大多数游戏来说,这种模式都是必须的。 :open_book: 产品特点 ...
NULL 博文链接:https://linxingliang.iteye.com/blog/1217811