单例模式的五种方式

主要:懒汉式,饿汉式

其他:双重检测锁(Double Checking模式),静态内部类,枚举模式

选取时机

延时加载,占用内部资源大:静态内部类好于懒汉

不延时加载,占用内部资源小:枚举好于饿汉

/**
 * 单例模式 懒汉式
 * @author 小帆敲代码
 *
 */
public class Demo01 {
 //类加载时,不初始化(可以延时加载)
 private static Demo01 instance;
 private Demo01(){
 }
 //上锁,并发效率低
 public static synchronized Demo01  getInstance() {
  if(instance==null) {
   instance=new Demo01();
  }
  return instance;
 }
}

/**
 * 单例模式 饿汉式
 * @author 小帆敲代码
 *
 */
public class Demo02 {
 //类加载时,对象就被初始化(不可以延时加载),天然的线程安全,并发效率高
 private static Demo02 instance=new Demo02();
 private Demo02(){
 }
 //不上锁,并发效率高
 public static  Demo02  getInstance() {
  return instance;
 }
}

/**
 * 双重检测 Double checking
 * 问题 指令重排和JVM内部模型不支持可能会带来问题
 * 解决方法:volatile取消指令重排
 * @author 小帆敲代码
 *
 */
public class Demo03 {
  private /* volatile*/ static Demo03 instance=null;
  private Demo03() {
   
  }
  public static Demo03 getInstance() {
   //double checking
   if(null==instance) {
    //只在第一次创建时锁
    synchronized(Demo03.class) {
     if(null==instance)
     instance=new Demo03();
    }
   }
   return instance;
  }
}

/**
 * 静态内部类实现单例模式
 * 线程安全,效率高,延迟加载
 * @author 小帆敲代码
 *
 */
public class Demo04 {
 //外部类没有static属性,只有在被使用时才会被加载内部类
  private static class SingleDemo04{
   private static /*final*/ Demo04 instance=new Demo04();
  }
  private Demo04() {
   
  }
  public static Demo04 getInstance() {
   return new SingleDemo04().instance;
  }
}

/**
 * 枚举模式实现单例
 * 保证只有一个,线程安全,天然的防止反射和反序列化的漏洞
 * 不能延时加载
 * @author 小帆敲代码
 *
 */
public enum Demo05 {
 //只有一个实例
  INSTANCE;
 
 //其他操作
 public void dosomething() {
  
 }
}

设计模式GOF23之单例模式的更多相关文章

  1. 【白话设计模式四】单例模式(Singleton)

    转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...

  2. php设计模式笔记:单例模式

    php设计模式笔记:单例模式 意图: 保证一个类仅有一个实例,并且提供一个全局访问点 单例模式有三个特点: 1.一个类只有一个实例2.它必须自行创建这个实例3.必须自行向整个系统提供这个实例 主要实现 ...

  3. Java设计模式之《单例模式》及应用场景

    摘要: 原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6510196.html 所谓单例,指的就是单实例,有且仅有一个类实例,这个单例不应该 ...

  4. Java设计模式之【单例模式】

    Java设计模式之[单例模式] 何为单例 在应用的生存周期中,一个类的实例有且仅有一个 当在一些业务中需要规定某个类的实例有且仅有一个时,就可以用单例模式 比如spring容器默认初始化的实例就是单例 ...

  5. Java设计模式中的单例模式

    有时候在实际项目的开发中,我们会碰到这样一种情况,该类只允许存在一个实例化的对象,不允许存在一个以上的实例化对象,我们将这种情况称为Java设计模式中的单例模式.设计单例模式主要采用了Java的pri ...

  6. C#设计模式学习笔记-单例模式随笔

    最近学习 设计模式,从单例模式入手 啥是单例模式: 要实现一个单例类的话,首先,肯定是不能让用户自行生产的,那就是说明不能让用户new,所以,就必须把构造函数设置成为私有的 因为静态变量的生命周期跟整 ...

  7. IOS设计模式浅析之单例模式(Singleton)

    说在前面 进入正式的设计模式交流之前,扯点闲话.我们在项目开发的过程中,经常会不经意的使用一些常见的设计模式,如单例模式.工厂方法模式.观察者模式等,以前做.NET开发的时候,认真拜读了一下程杰老师的 ...

  8. C#设计模式学习笔记-单例模式(转)

    C#设计模式学习笔记-单例模式 http://www.cnblogs.com/xun126/archive/2011/03/09/1970807.html 最近在学设计模式,学到创建型模式的时候,碰到 ...

  9. PHP 面向对象编程和设计模式 (3/5) - 单例模式和工厂模式

    PHP高级程序设计 学习笔记 2014.06.11 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容 ...

随机推荐

  1. BUUOJ [WUSTCTF2020]朴实无华

    [WUSTCTF2020]朴实无华 复现了武科大的一道题/// 进入界面 一个hack me 好吧,直接看看有没有robot.txt 哦豁,还真有 好吧 fAke_f1agggg.php 看了里面,然 ...

  2. window 下 jmeter+ant 自动生成html报告并发送邮件

    一.安装ant 1.ant 下载地址:https://ant.apache.org/bindownload.cgi 2.下载完成解压到指定目录下 3.配置ant 环境变量 新建系统变量 -ANT_HO ...

  3. Tensorflow 模型线上部署

    获取源码,请移步笔者的github: tensorflow-serving-tutorial 由于python的灵活性和完备的生态库,使得其成为实现.验证ML算法的不二之选.但是工业界要将模型部署到生 ...

  4. Golang Web入门(4):如何设计API

    摘要 在之前的几篇文章中,我们从如何实现最简单的HTTP服务器,到如何对路由进行改进,到如何增加中间件.总的来讲,我们已经把Web服务器相关的内容大概梳理了一遍了.在这一篇文章中,我们将从最简单的一个 ...

  5. C#多线程(13):任务基础①

    目录 多线程编程 多线程编程模式 探究优点 任务操作 两者创建任务的方式 Task.Run() 创建任务 取消任务和控制任务的创建 任务返回结果以及异步获取返回结果 捕获任务异常 全局捕获任务异常 多 ...

  6. centos7与8的区别

    1.关于内核版本:RHEL8采用4.18.0-xRHEL7采用3.10-0-x 2 网络时间同步 RHEL8 只使用Chronyd,不支持NTP部署. RHEL7Chronyd与NTP两者都支持 3. ...

  7. JDK14的新特性:Lombok的终结者record

    目录 简介 新的Record类型 探讨Record的秘密 record扩展 总结 JDK 14的新特性:Lombok的终结者record 简介 自从面向对象产生之后,程序界就开始了新的变化,先是C发展 ...

  8. 更加安全的密钥生成方法Diffie-Hellman

    更加安全的密钥生成方法Diffie-Hellman 之前我们谈到了密钥配送的问题,这个世界是如此的危险, 一不小心通信线路就会被监听,那么我们怎么在这种不安全的线路中传递密钥呢? 这里我们介绍一下Di ...

  9. jQuery动态时钟

    效果图: 引用的jQuery.js自己百度 代码: <!DOCTYPE html> <html> <head> <meta charset="utf ...

  10. material UI中withStyles和makeStyles的区别

      在material UI中,withStyles和makeStyles是经常使用的两个用于封装样式的函数.对于刚使用material UI的开发者而言,可能不太清楚这两者的区别.   本文简要探究 ...