概述

Java中单例模式的实现有多重方法, 要实现单例模式主要的问题是线程安全问题以及对Lazy Load的考虑,主要有如下几种

  1. 双重锁定懒加载单例
  2. 预加载单例
  3. 枚举单例

双重锁定懒加载单例模式

/**
* 双重锁定懒加载单例实现
*
* @author zhenwei.liu created on 2013 13-9-23 上午10:49
* @version 1.0.0
*/
public class DoubleCheckedLockingSingleton { private static volatile DoubleCheckedLockingSingleton INSTANCE;
private static Object lock = new Object(); private volatile Var var; /** 阻止用户实例化单例工厂 */
private DoubleCheckedLockingSingleton() {
var = new Var();
} public static DoubleCheckedLockingSingleton getInstance() {
if (INSTANCE == null) { //
synchronized (lock) {
if (INSTANCE == null) {
INSTANCE = new DoubleCheckedLockingSingleton(); //
}
}
}
return INSTANCE;
} public void getVar() {
return var; // 3
}
}

按照Happen-Before内存模型,  如果两个线程都进入了 synchronized 同步块, 则肯定能见到前一个同步块执行的内容, 但是由于出现下列情况

1. 线程 t1 执行 1 -> 2 代码序列

2. 线程 t2 执行 1, 然后发现INSTANCE不为空, 直接返回instance, 而并没有进入同步块, 这个时候由于没有happen-before的保证, 则 t2 在执行 3, 有可能获得的var为null(并没有看到t1在构造方法对var实例化的过程), 所以我们需要加上volatile, 这样就不会出现这个成员变量不一致的问题.

预加载单例

/**
* 预加载单例实现
*
* @author zhenwei.liu created on 2013 13-9-23 上午10:52
* @version 1.0.0
*/
public class NoneLazyLoadedSingleton { /** 加载类信息时实例化单例 */
private static NoneLazyLoadedSingleton INSTANCE = new NoneLazyLoadedSingleton(); /** 阻止用户实例化单例工厂 */
private NoneLazyLoadedSingleton() {} public static NoneLazyLoadedSingleton getInstance() {
return INSTANCE;
} public void action() {
System.out.println("do something");
}
}

枚举单例

/**
* 枚举的单例实现
*
* @author zhenwei.liu created on 2013 13-9-23 上午11:00
* @version 1.0.0
*/
public enum EnumSingleton implements Serializable {
INSTANCE; public void action() {
System.out.println("do something");
} /**
* readResolve()方法会在ObjectInputStream读取完对象准备返回前调用
* 如果定义了readResolve()方法,则由readResolve方法指定返回对象
*
* @return
*/
private Object readResolve() {
return INSTANCE;
}
}

枚举没有构造方法,它的每一个示例都是静态的单例,并且可以定义成员变量及其行为,可以说是纯天然的单例实现

需要注意的地方是对单例反序列化的时候,需要定义readResolve()方法,否则每次反序列化readObject()方法每次都会返回一个新的示例

Java Singleton Implementation的更多相关文章

  1. Java Singleton 单例模式

    大家可能还听过 Singleton  也就是单例模式 这个单例模式要求 在程序的运行时候   一个程序的某个类 只允许产生一个 实例 那么 这个类就是一个单例类 Java Singleton模式主要作 ...

  2. [Java] [Singleton] [DCL][happens-before]

    Singleton 只能有一个实例:必须自己创建自己的实例:必须给其他所有对象提供这一实例 实现方法 饿汉式singleton 预先加载法 class Single { private Single( ...

  3. Java Singleton的3种实现方式

    1.通过静态成员字段来实例化 public class Elvis { /** * 通过final的静态成员字段来调用私有的构造函数实例化对象 */ public static final Elvis ...

  4. Java Singleton(单例模式) 实现详解

    什么是单例模式? Intend:Ensure a class only has one instance, and provide a global point of access to it. 目标 ...

  5. Java singleton 一例

    org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of ...

  6. java singleton(单例设计模式)

    单例设计模式的主要作用是: 1.控制资源的使用,我们对资源使用线程同步来实现并发访问. 2.节约资源,我们对一个类只进行一个实例化进行全局的资源访问,节约了内存. 3.作为通信媒介,也是数据共享,可以 ...

  7. Java singleton 单例

    饿汉式,instance在类加载化时完成初始化,线程安全 package cookie; public class SingletonAtOnce { private SingletonAtOnce( ...

  8. The Java Enum: A Singleton Pattern [reproduced]

    The singleton pattern restricts the instantiation of a class to one object. In Java, to enforce this ...

  9. JAVA中Singleton的用法

    Java Singleton模式属于管理实例化过程的设计模式家族.Singleton是一个无法实例化的对象.这种设计模式暗示,在任何时候,只能由JVM创建一个Singleton(对象)实例. JAVA ...

随机推荐

  1. word2013 如何设置从第三页开始编码 或 如何设置封面页和正文页页码不连续

    首先说明一下 “分节符”作用,它就是用来将整个文档分节的,添加一个分节符,文档就分成1.2两节:添加两个分节符,文档就分成1.2.3节. 当前页面具体是第几节,可以通过点击页眉页脚来查看: 从第三页开 ...

  2. Eclipse添加SVN插件:导入项目+上传项目+更新项目

    首先在Eclipse中安装SVN插件,方法同安装Pydev相同 首先点击help,然后点击Install New Software 然后在弹出的窗口中点击Add,再在新弹出的窗口中的url栏输入如下内 ...

  3. odoo12主题样式模块

    odoo12主题样式模块 图标形式显示菜单目录的结构 odoo12图标形式显示菜单:https://apps.odoo.com/apps/themes/12.0/backend_theme_v12/ ...

  4. BZOJ1171 : 大sz的游戏

    f[i]=min(f[j])+1,线段j与线段i有交,且l[i]-l[j]<=L. 线段j与线段i有交等价于y[j]>=x[i],x[j]<=y[i]. 因为l[i]递增,所以可以维 ...

  5. Unity中Web.Config文件的配置与调用

    在上一篇文章“Unit简单依赖注入”我们可以实现构造对象和被依赖对象之间的 松耦合,使我们的抽象层(Player)能够保持稳定,但是在并没有把客户类和Player类之间彻底解耦,即当我们不想使用MP3 ...

  6. 详细分析Memcached缓存与Mongodb数据库的优点与作用

    http://www.mini188.com/showtopic-1604.aspx 本文详细讲下Memcached和Mongodb一些看法,以及结合应用有什么好处,希望看到大家的意见和补充. Mem ...

  7. jquery-chosen设置默认值

    <span style="font-size:18px;"> <select id="select1" class="select1 ...

  8. 关于C++类型检查的一点小挫折

     问题: 定义了一个float型数组Lut[],我让一个整型指针指向数组名int * Address=lut ; VS2008报错:  error C2440: '=' : cannot conv ...

  9. 基于ASP.NET WebAPI OWIN实现Self-Host项目实战

    引用 寄宿ASP.NET Web API 不一定需要IIS 的支持,我们可以采用Self Host 的方式使用任意类型的应用程序(控制台.Windows Forms 应用.WPF 应用甚至是Windo ...

  10. WebLogic使用总结(六)——WebLogic创建虚拟主机和修改启动端口号

    一.在WebLogic中创建一个虚拟主机 找到虚拟主机面板,如下图所示: