关键点

  1. 私有化构造器
  2. 通过静态方法或枚举返回单例类对象
  3. 确保单例类对象只有一个,尤其在多线程环境下。
  4. 确保每个类被序列化不会重新创建对象

饿汉式

/*
饿汉式
*/
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton(){};
public static Singleton getInstance() {
return instance;
}
}

懒汉式

懒汉式缺点:

第一次加载需要及时进行实例化,反应稍慢

每次调用getInstance都会进行同步,造成不必要的同步开销

 /*
懒汉式
*/
public class Singleton {
private static Singleton instance = null;
private Singleton(){};
public static synchronized Singleton getInstance() {
if (instance == null)
instance = new Singleton();
return instance;
}
}

双检锁

  /*
双检索 CAS
*/ public class Singleton {
private static volatile Singleton instance = null;
private Singleton(){};
public static Singleton getInstance() {
if ( instance == null ) {
synchronized (Singleton.class) {
if (instance == null)
instance = new Singleton();
}
} return instance;
}
}

静态内部类单例模式

优点:

第一次加载Singleton类并不会初始化instance,只有在第一次调用getInstance

方法时才会导致instance被初始化(延迟加载)。这种方式不仅能够确保线程安全,也能够保证单例对象的唯一性(利用Classloader的特性),同时也延迟了单例的实例化,所> 以这是推荐使用的单例模式实现方式。

//静态内部类单例模式
public class Singleton {
private Singleton(){};
public static Singleton getInstance() {
return SingletonHolder.instance;
} private static class SingletonHolder {
private static final Singleton instance = new Singleton();
}
}

枚举方式

public enum Singleton {
INSTANCE;
}
//==========完整代码===
// 定义单例模式中需要完成的代码逻辑
public interface MySingleton {
void doSomething();
} public enum Singleton implements MySingleton {
INSTANCE {
@Override
public void doSomething() {
System.out.println("complete singleton");
}
}; public static MySingleton getInstance() {
return Singleton.INSTANCE;
}
}

单例模式的几种实现-Java版的更多相关文章

  1. 【设计模式】C++单例模式的几种写法——Java自动加载内部类对象,C++怎么破?

    单例模式是最简单的设计模式,就让我像玩简单的游戏一样写下去吧. v1: 简单模式 和这个版本有过一面之缘,但不敢苟同. class Singleton { private: Singleton() { ...

  2. 南阳ACM 题目8:一种排序 Java版

    一种排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽都是整数:现 ...

  3. 设计模式之单例模式的几种写法——java

    对于设计模式的使用场景和好处,之前有介绍一篇,今天主要是单例模式的编写方式,直接看代码吧 单例模式之饿汉模式,不会懒加载.线程安全 /** * @Author wangtao * @Descripti ...

  4. java设计模式之单例模式(几种写法及比较)

    概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...

  5. java单例模式的几种写法比较

    概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...

  6. JAVA中单例模式的几种实现方式

    1 线程不安全的实现方法 首先介绍java中最基本的单例模式实现方式,我们可以在一些初级的java书中看到.这种实现方法不是线程安全的,所以在项目实践中如果涉及到线程安全就不会使用这种方式.但是如果不 ...

  7. Java设计模式之单例模式(七种写法)

    Java设计模式之单例模式(七种写法) 第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作: public class Singleton { private static Singleto ...

  8. Java 单例模式的七种写法

    Java 单例模式的七种写法 第一种(懒汉,线程不安全) public class Singleton { private static Singleton instance; private Sin ...

  9. 单例模式:Java单例模式的几种写法及它们的优缺点

    总结下Java单例模式的几种写法: 1. 饿汉式 public class Singleton { private static Singleton instance = new Singleton( ...

随机推荐

  1. [Android]XML和JSON的区别

    1.定义介绍 (1).XML定义 扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允 ...

  2. BZOJ-3555:企鹅QQ(字符串哈希)

    PenguinQQ是中国最大.最具影响力的SNS(Social Networking Services)网站,以实名制为基础,为用户提供日志.群.即时通讯.相册.集市等丰富强大的互联网功能体验,满足用 ...

  3. Cent OS 6.5 下 Node.js安装

    打开官网 http://nodejs.org/ 点击那个绿色的INSTALL 按钮下载安装包,然后解压.   基本的环境我原本已经安装完毕,这是需求的环境,来源安装包中的README.md,需要的自行 ...

  4. NET中并行开发优化

    NET中并行开发优化 让我们考虑一个简单的编程挑战:对大数组中的所有元素求和.现在可以通过使用并行性来轻松优化这一点,特别是对于具有数千或数百万个元素的巨大阵列,还有理由认为,并行处理时间应该与常规时 ...

  5. VS Code开发调试.NET Core 2.0

    VS Code开发调试.NET Core 2.0 使用VS Code 从零开始开发调试.NET Core 2.0.无需安装VS 2017 15.3+即可开发调试.NET Core 2.0应用. VS ...

  6. CSS——三种页面引入方法

    目的:为了把样式和内容分开,并且使网页元素更加丰富,引入了CSS CSS页面引入有三种方式: 1)内联式:比较不常用,因为内容和样式仍然在一起,不方便.示例: <!DOCTYPE html> ...

  7. HandlerMapping执行过程。。。

    1.web.xml DispatcherServlet 类 寻址 doDispatch() 2.getHandler(requset) 点击,进入 3.HandlerMapping hm=xxxxxx ...

  8. 通用的ashx调用

    直接上代码 还是有一定通用性的 <%@ WebHandler Language="C#" Class="MyService" %> using Sy ...

  9. HBase数据模型(2)

    HBase数据模型(1) HBase数据模型(2) 1.0 HBase的版本version,是一个用长整型表示的.由Rowkey.Column(列族和列).Version组合在一起称为HBase中的一 ...

  10. 对Yii 2.0模型rules的理解(load()无法正确装载数据)

    在实际开发中,遇到数据表新增字段而忘记了在对应模型中rules规则中添加新增的字段,而导致load()方法装载不到新增字段,导致新增字段无法写入数据库中.   解决办法:在新增字段后及时在对应模型ru ...