以前我就知道单例模式的两种写法,如今经发现那两种是很基础的用法,下面分享一下,各种单例的写法吧,我个人还是比较喜欢用枚举类的方式写单例,优雅简洁,还安全。
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
分享到:
相关推荐
这种模式在很多场景下都非常有用,比如控制数据库连接、管理缓存或者全局配置等。下面我们将详细探讨单例模式的七种常见实现方式。 1. **懒汉式(线程不安全)**: 这是最直观的实现方式,它延迟初始化单例,只有当...
这种写法的问题是它没有考虑线程安全问题,在并发环境下很可能出现多个 Singleton1 实例。 2、懒汉式单例(加同步) public class Singleton2 { private Singleton2() {} private static Singleton2 single = ...
在Java编程语言中,实现单例模式的方法有很多种,不同的实现方式具有不同的特点和适用场景。本文将详细介绍七种常见的Java单例模式实现方式。 #### 第一种:懒汉式,线程不安全 ```java public class Singleton { ...
单例模式是一种常用的软件设计模式,在很多编程语言中都有广泛的应用。在Python中实现单例模式不仅有助于提高代码的可读性和可维护性,还能有效控制资源的使用。本文将详细介绍Python中实现单例模式的三种方法:使用...
根据提供的文件内容,可以得知,单例模式的实现方式在Java中有很多种,每种都有其使用场景和优缺点。在实际应用中,选择合适的单例模式实现方式,可以有效地解决资源浪费和访问冲突问题,提高系统的稳定性和性能。
Objective-C中的单例模式是一种设计模式,用于在整个应用程序中确保只有一个特定类的实例存在,并提供一个全局访问点来获取这个实例。单例模式在iOS开发中广泛应用,特别是在管理共享资源、配置设置或网络请求等场景...
Java设计模式单例模式(Singleton)用法解析 java设计模式单例模式(Singleton)是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局反访问点。单例模式是创建型模式。单例模式在生活中应用也很广泛,...
也看过很多高级教程,觉得自己还是比较热衷于js的设计模式。这一次重温一下《JavaScript设计模式与开发实践》,开篇为单例模式。 /** * pre 单例模式 * 定义:保证一个类仅有一个实例,并提供一个访问它的全局...
JAVA多线程并发下的单例模式应用 单例模式是设计模式中比较简单的一个,也是非常常见的,但是在多线程并发的环境下使用却是不那么简单了。今天我们将分享一个在开发过程中遇到的单例模式的应用。 单例模式的定义:...
用于多线程环境下的单例模式,确保对象的唯一性,同时减少同步开销: ```java private volatile Singleton instance; public Singleton getInstance() { if (instance == null) { synchronized (this) { if ...