实现方式大致分为两种

  • 懒汉模式
  • 饿汉模式

懒汉模式:在第一次使用该对象时,才会初始化实例,以免了资源的浪费,同时,需要考虑的是线程安全问题。

饿汉模式:在类初始化时就需要创建一个实例对象出来,当时并不一定会使用该对象,可能会造成资源的浪费,好处是不用考虑安全问题。

下面看下几种常见的实现方式:

首先看懒汉模式:

1、线程非安全版本,可在单线程下使用

/*** 懒汉式单例,线程不安全,只有在第一次调用时才会初始化一次,* 但是线程不安全,如果在初始化时需要消耗大量的资源,则会造成资源的浪费,同时,在并发场景中,可能造成变量的变化等问题。* @author woniu**/
public class Singleton1
{private Singleton1(){}private static Singleton1 instance = null;public static Singleton1 getInstance(){if (instance == null){instance = new Singleton1();}return instance;}
}

关于懒汉模式的几种线程安全版本,详细的说明已在类中说明,不在单独说明。

1、在getInstance方法上加同步

/*** 懒汉式单例,线程安全,与第一种无异,仅是通过synchronized,将getInstance实现为了同步方法,* 但是,这就造成了getInstance方法,仅能同时只有一个线程调用,但是,在除去第一次初始化外,我们大多数情况下,并不需要防止同步问题。* @author woniu*/
public class Singleton2
{private Singleton2(){}private static Singleton2 instance = null;public static synchronized Singleton2 getInstance(){if (instance == null){instance = new Singleton2();}return instance;}
}

2、双重检查锁定

/*** 此方法被称为双重校验锁,在示例2的基础之上将同步方法,修改为了同步代码块,仅是在需要初始化时,才需要加锁,这样就避免了在大多数情况下不需要同步的问题。* 关于之所以在同步方法块中再次进行判断的原因:根据并发编程实战中的提到的“先检查后执行”的操作是非原子性的,简而言之就是,避免用一个过期的变量作为当前的判断标准。* 连接:http://www.cnblogs.com/woniu4/p/8284244.html* @author woniu**/
public class Singleton3
{private Singleton3(){}private volatile static Singleton3 instance = null;public static Singleton3 getInstance(){if (instance == null){synchronized(Singleton3.class){if (instance == null){instance = new Singleton3();}}}return instance;}
}

3、静态内部类

/*** 单例同样可以通过内部类的方式实现,这样就避免了同步带来的性能开销(虽说现在synchronize方法已经做了很大的优化,对性能的影响已经降低了很多,但终究还是有一定影响的。)* 虽说这种方式比较好,但是在我们当前项目中,似乎大家都比较懒,直接用了方法2中的模式,毕竟,当前的工程性项目,并没有对项目性能有极高的要求。* @author woniu**/
public class Singleton4
{private Singleton4(){};private static class LasyHolder{private static final Singleton4 INSTANCE = new Singleton4();}public static Singleton4 getInstance(){return LasyHolder.INSTANCE;}
}

饿汉模式:

/*** 饿汉模式,通过在类初始化时,已经实例化,这样本身就是线程安全的。* @author woniu**/
public class Singleton5
{private Singleton5(){}private static final Singleton5 INSTANCE = new Singleton5();public static Singleton5 getInstance(){return INSTANCE;}
}

最后有一种通过枚举实现的方式,算是一种比较新的方式吧。当前不清楚具体归属类型,暂且单列出来。

/*** 枚举模式,没有使用过,仅是博客或者书见过这种方式,不仅能避免线程同步问题,而且还能防止反序列化重新创建新的对象,日后工作中,有类似需要单例场景中,可以考虑使用一下,写法还是十分简单的。* @author woniu**/
public enum Singleton6
{INSTANCE;public String testMethod(){return "test enum instance";}public static void main(String[] args){String str = INSTANCE.testMethod();System.out.println(str);}
}

转载于:https://www.cnblogs.com/woniu4/p/8287484.html

单例模式的几种实现方式相关推荐

  1. 单例模式的几种实现方式及优缺点

    参考:单例模式的几种实现方式及优缺点. 转载于:https://www.cnblogs.com/wenxiangchen/p/11343331.html

  2. python实现单例模式的几种方式_基于Python中单例模式的几种实现方式及优化详解...

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

  3. Java单例模式的几种实现方式

    Java单例模式的几种实现方式 在Java 中,单例类只能有一个实例,必须创建自己的唯一实例,单例类必须给所有其他对象提供这一实例.Java 单例模式有很多种实现方式,在这里给大家介绍单例模式其中的几 ...

  4. python创建单例模式_Python单例模式的四种创建方式实例解析

    单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...

  5. 单例模式的四种实现方式(饿汉模式、懒汉模式、静态内部类、枚举类)

    首先,设计模式是我们程序员在软件开发过程中面临的一般问题的解决方案,通过学习设计模式可以使我们在编程时更加有条理性,同时培养我们写代码的思维能力,从而提高我们的工作效率.接下来就跟着博主的脚步往下走吧 ...

  6. 单例模式的几种实现方式详解以及原理

    单例模式介绍 前言 这是一个的萌新写的博客,以下是学习课程以后的总结,用于个人的复习与总结,如果有误还请多多包容和指正. 了解单例模式: 单例类只能有一个实例 单例必须创建自己的唯一一个实例 单例类必 ...

  7. 【无标题】单例模式的两种创建方式:饿汉式和懒汉式

    这里写自定义目录标题 单例模式的两种创建方式:饿汉式和懒汉式 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂 ...

  8. Java 单例模式常见五种实现方式

    定义 单例模式,属于创建类型的一种常用的软件设计模式. 单例模式最初的定义出现于<设计模式>(艾迪生维斯理, 1994):"保证一个类仅有一个实例,并提供一个访问它的全局访问点. ...

  9. Java23种设计模式之单例模式的五种实现方式、反射破解单例模式、不能破解枚举单例模式详解

    源码链接(Gitee码云):https://gitee.com/oldou/javadesignpatterns 这里有我整理好的Java23种设计模式的源码以及博客教程,博客教程中介绍了Java23 ...

  10. Java面试23种设计模式之单例模式的8种实现方式

    单例模式8中实现方式 1.单例模式介绍 2.单例模式的八种方式 3.饿汉式(静态常量),这种单例模式可用,可能造成内存浪费. 4.饿汉式(静态代码块),这种单例模式可用,可能造成内存浪费. 5.懒汉式 ...

最新文章

  1. golang if 条件判断语句 简介
  2. CodeForces: 360(div1)361(div2)
  3. hash地址_redis中的hash扩容、渐进式rehash过程
  4. UIScrollview 技巧
  5. 计组之数据运算:9、浮点数的表示
  6. 关于netty的FastThreadLocal的思考
  7. Python爬虫辅助库BeautifulSoup4用法精要
  8. c#中结构与类的区别(转)
  9. 自己动手开发编译器特别篇——用词法分析器解决背诵圣经问题
  10. SpringMVC的拦截器Inceptor
  11. “SCSA-S学习导图+”系列:Windows下的WEB系统环境搭建
  12. 音视频 H.264格式介绍
  13. AOD实践,modis数据下载,modis数据处理,
  14. react-ssr之路由配置
  15. 新标准的发布关联的液相色谱-三重四极杆质谱技术的联用
  16. 苹果系统版本依次顺序_苹果手机机型排行顺序
  17. WPF Blend 自定义控件
  18. mac 下禁止顽固的开机程序自启
  19. WinUsb_ReadPipe和WinUsb_WritePipe函数功能理解
  20. java加载图片的问题

热门文章

  1. 模板方法模式(TemplateMethod) 简介
  2. antd 函数组件_React - 组件:函数组件
  3. 看完这篇,Oracle数据库运维不用愁
  4. 【干货】交换机密码恢复教程
  5. 【必看】Linux 系统的备份恢复
  6. matlab用lism求零输入响应,信号与系统matlab课后作业_北京交通大学讲解.docx
  7. filter过滤器_不了解布隆过滤器?一文给你整的明明白白!
  8. laravel redis_如何将redis优化
  9. 函数用计算机代码,用main函数传参做简单的计算器的代码
  10. java 优先队列 用法_优先队列的基本用法(java和c++)