【设计模式】单例模式(Singleton Pattern)

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

首次调用时进行初始化;
synchronized加锁保证线程安全;

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

类加载时就实例化,避免了多线程同步问题,不需要加锁;

  • 双重校验锁(DCL, double checked locking)
public class Singleton {
      private volatile static Singleton instance;
      private Singleton() {};
      public static Singleton getInstance() {
            if (instance == null){
                  synchronized (Singleton.class) {
                        if (instance == null){
                              instance = new Singleton();
                        }
                  }
            }
            return instance;
      }
}

首次调用时进行初始化;
volatile关键字保证了变量在多线程下的可见性以及防止指令重排;
通过加锁和两次校验是否实例化避免多线程多次创建实例的问题;如:
当实例未被创建时,线程t1调用getInstance方法,第一次判断instance==null为真,继续执行,进入同步代码块。在t1创建实例之前,线程t2也调用了getInstance方法,并且由于实例还未被创建,t2同样可以通过第一个if,继续往下执行。t1创建完实例后退出同步代码块,t2进入,此时,如果没有第二个if,那么t2也会创建一个实例,但是加上第二个if,就可以避免这个多线程多次创建实例的问题。

  • 静态内部类
public class Singleton {
      private static class SingletonHolder {
            private static final Singleton INSTANCE = new Singleton();
      }
      private Singleton() {};
      public static final Singleton getInstance() {
            return SingletonHolder.INSTANCE;
      }
}

利用类加载机制避免多线程同步问题;
静态内部类延迟了初始化,只有调用getInstance方法时才会加载内部类,从而实例化;

(0)

相关推荐

  • 单例模式的实现

    记一下学习单例模式的笔记: 单例就是要保证该类仅有一个实例.实现完全封闭的单例(外部不能new)其实就要两点要求: 全局访问:需要一个该类型的全局静态变量,每次获取实例时都要判断它是否null,不存在 ...

  • 枚举实现单例模式

    枚举实现单例模式

  • 单例模式的八种写法

    单例模式作为日常开发中最常用的设计模式之一,是最基础的设计模式,也是最需要熟练掌握的设计模式.单例模式的定义是:保证一个类仅有一个实例,并提供一个访问它的全局访问点.那么你知道单例模式有多少种实现方式 ...

  • 设计模式笔记(一):Singleton 设计模式

    今天开始学习设计模式,借此机会学习并整理学习笔记. 设计模式是一门不区分语言的课程,什么样的编程语言都可以用到设计模式.如果说java语法规则比作武功招式的话,那么设计模式就是心法. 设计模式共有23 ...

  • java常见设计模式之---单例模式

    java常见设计模式之---单例模式 1.单例模式简介 应用场景举例 2.单例模式的特点 3.单例模式和静态类 4.单例模式的经典实现 饿汉式单例(典型实现) 饿汉式-静态代码块 懒汉式单例创建,五种 ...

  • 大话设计模式笔记(十八)の单例模式

    单例模式 定义 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象.一个最好的办法就是,让类自身负责保存它的唯一实例.这 ...

  • 设计模式之单例模式(Singleton Pattern)

    一.定义 一个类只有一个实例,且该类能自行创建这个实例的一种模式. 二.单例模式举例 例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各 ...

  • 【转】C#设计模式-单例模式(Singleton Pattern)

    目录 介绍 第一个版本 --不是线程安全的 第二个版本 -- 简单的线程安全 第三个版本 - 使用双重检查锁定尝试线程安全 第四个版本 - 不太懒,不使用锁且线程安全 第五版 - 完全懒惰的实例化 第 ...

  • 设计模式之单例模式(Singleton Pattern),太简单了

    基本定义 单例模式就是确保某一个类只有一个实例,并且提供一个全局访问点.单例模式有如下几个特点: 它只有一个实例. 它必须要自行实例化. 它必须自行向整个系统提供访问点. 代码实现 饿汉式 直接初始化 ...

  • 【1/25】将Game改写为单例模式(Singleton Pattern)

    这是<小游戏从0到1设计模式重构>系列内容第1篇,所有源码及资料在"程序员LIYI"公号回复"小游戏从0到1"获取. Game的实例在游戏时只有一个 ...

  • 设计模式 | 单例模式(singleton)

    定义: 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 结构:(书中图,侵删) 结构超简单.就在你想控制实例数的类上操作即可. 1.定义一个static的对象引用 2.私有化构造方法 3.提供 ...

  • 设计模式-单例模式

    单例模式 优点 由于单例模式在内存中只有一个实例,减少了内存开支,特别是 一个对象需要频繁地创建.销毁时,而且创建或销毁时性能又无法优 化,单例模式的优势就非常明显. 由于单例模式只生成一个实例,所以 ...

  • Python单例模式(Singleton)的N种实现

    很多初学者喜欢用全局变量,因为这比函数的参数传来传去更容易让人理解.确实在很多场景下用全局变量很方便.不过如果代码规模增大,并且有多个文件的时候,全局变量就会变得比较混乱.你可能不知道在哪个文件中定义 ...

  • 浅谈C++设计模式--单例模式

    单例模式(Singleton)[分类:创建型] [目的:为程序的某个类的访问,提供唯一对象实例] 这估计是设计模式里面最简单的一个类了,下面我们一起看看,单例它是什么?以及如何实现一个单例 基本定义 ...

  • 设计模式-单例模式code

    package singeton; import java.security.SecureRandom; /** * @author Zero * @since 2019-08-13. * Descr ...