概述

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. win10+wget 收藏

    win10+wget  收藏    https://blog.csdn.net/qq_31163325/article/details/84344774 1.下载地址:https://eternall ...

  2. 洛谷P4742 [Wind Festival]Running In The Sky [Tarjan缩点,DAGDP]

    题目传送门 Running In The Sky 格式难调,题面就不放了. 分析: 一句话题意:给定一张带点权的有向图,求最长点权路径及该路径上的最大点权. 很明显的$DAGDP$,因此需要缩点,将该 ...

  3. 【python学习-3】python数据类型

    1.数字 在python 2.x中,数字类型有4种,int.long.float 和 complex(复数):而python 3 中,只有 int.float 和 complex 3种,python ...

  4. 循序渐进学.Net Core Web Api开发系列【9】:常用的数据库操作

    系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇描述一 ...

  5. 【转载】EmptyWorkingSet 程序运行内存整清理

    网络上找了很多关于内存整理的文章,不外乎都是使用EmptyWorkingSet来实现.就如下面这段代码. #include "stdafx.h"#include <windo ...

  6. 浅谈web缓存(转)

    这是一篇知识性的文档,主要目的是为了让Web缓存相关概念更容易被开发者理解并应用于实际的应用环境中.为了简要起见,某些实现方面的细节被简化或省略了.如果你更关心细节实现则完全不必耐心看完本文,后面参考 ...

  7. JAVA GC 图解

    http://www.cnblogs.com/hnrainll/archive/2013/11/06/3410042.html http://www.blogjava.net/ldwblog/arch ...

  8. EF6+Sqlite连接字符串的动态设置

    摘要 在winform中应用sqlite和ef,对于sqlite连接字串的设置,大多情况下是不想写死了,你不知道用户会将你的exe程序安装在什么位置,也不知道他的电脑盘符是什么,如果写死了,那么很有可 ...

  9. In House打包流程

    在一个app历经数周持续开发和多个版本快速内部迭代之后,当我们需要把这个版本发布到我们实际应用场景中,面对我们真实用户去say hi时,如果自身产品在发布(内测版本)之前确实找到一些潜在切相对稳定的种 ...

  10. EF Code First更新数据库时报错:provider: SQL Network Interfaces, error: 26

    在使用EF Code First更新数据库时报如下错误: 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误.未找到或无法访问服务器.请验证实例名称是否正确并且 SQL Serv ...