单例模式:保证一个类在内存中的对象唯一,有且仅能实例化一次。(如多个代码块需要读取配置文件,or开启事务,orjdbc读取数据源就是个经典例子)参考:吟啸且徐行

  实现步骤:

  • 私有构造方法。保证唯一的
  • 创建私有的静态的本类的对象
  • 定义共有静态方法,返回该对象。
    1. /**
    2. * 方法一
    3. * 单例模式的实现:饿汉式,线程安全 但效率比较低
    4. */
    5. public class SingletonTest {
    6.  
    7. // 定义一个私有的构造方法
    8. private SingletonTest() {
    9. }
    10.  
    11. // 将自身的实例对象设置为一个属性,并加上Static和final修饰符
    12. private static final SingletonTest instance = new SingletonTest();
    13.  
    14. // 静态方法返回该类的实例
    15. public static SingletonTest getInstancei() {
    16. return instance;
    17. }
    18.  
    19. }

    方法一就是传说的中的饿汉模式
    优点是:写起来比较简单,而且不存在多线程同步问题,避免了synchronized所造成的性能问题;
    缺点是:当类SingletonTest被加载的时候,会初始化static的instance,静态变量被创建并分配内存空间,从这以后,这个static的instance对象便一直占着这段内存(即便你还没有用到这个实例),当类被卸载时,静态变量被摧毁,并释放所占有的内存,因此在某些特定条件下会耗费内存。

    1. /**
    2. *方法二
    3. * 单例模式的实现:饱汉式,非线程安全
    4. *
    5. */
    6. public class SingletonTest {
    7.  
    8. // 定义私有构造方法(防止通过 new SingletonTest()去实例化)
    9. private SingletonTest() {
    10. }
    11.  
    12. // 定义一个SingletonTest类型的变量(不初始化,注意这里没有使用final关键字)
    13. private static SingletonTest instance;
    14.  
    15. // 定义一个静态的方法(调用时再初始化SingletonTest,但是多线程访问时,可能造成重复初始化问题)
    16. public static SingletonTest getInstance() {
    17. if (instance == null)
    18. instance = new SingletonTest();
    19. return instance;
    20. }
    21. }

    方法二就是传说的中的饱汉模式
    优点是:写起来比较简单,当类SingletonTest被加载的时候,静态变量static的instance未被创建并分配内存空间,当getInstance方法第一次被调用时,初始化instance变量,并分配内存,因此在某些特定条件下会节约了内存;
    缺点是:并发环境下很可能出现多个SingletonTest实例。

    1. /**
    2. *方法三
    3. * 单例模式的实现:饱汉式,线程安全简单实现
    4. *
    5. */
    6. public class SingletonTest {
    7.  
    8. // 定义私有构造方法(防止通过 new SingletonTest()去实例化)
    9. private SingletonTest() {
    10. }
    11.  
    12. // 定义一个SingletonTest类型的变量(不初始化,注意这里没有使用final关键字)
    13. private static SingletonTest instance;
    14.  
    15. // 定义一个静态的方法(调用时再初始化SingletonTest,使用synchronized 避免多线程访问时,可能造成重的复初始化问题)
    16. public static synchronized SingletonTest getInstance() {
    17. if (instance == null)
    18. instance = new SingletonTest();
    19. return instance;
    20. }
    21. }

    方法三为方法二的简单优化
    优点是:使用synchronized关键字避免多线程访问时,出现多个SingletonTest实例。
    缺点是:同步方法频繁调用时,效率略低。

    1. /**
    2. * 方法四
    3. * 单例模式最优方案
    4. * 线程安全 并且效率高
    5. *
    6. */
    7. public class SingletonTest {
    8.  
    9. // 定义一个私有构造方法
    10. private SingletonTest() {
    11.  
    12. }
    13. //定义一个静态私有变量(不初始化,不使用final关键字,使用volatile保证了多线程访问时instance变量的可见性,避免了instance初始化时其他变量属性还没赋值完时,被另外线程调用)
    14. private static volatile SingletonTest instance;
    15.  
    16. //定义一个共有的静态方法,返回该类型实例
    17. public static SingletonTest getIstance() {
    18. // 对象实例化时与否判断(不使用同步代码块,instance不等于null时,直接返回对象,提高运行效率)
    19. if (instance == null) {
    20. //同步代码块(对象未初始化时,使用同步代码块,保证多线程访问时对象在第一次创建后,不再重复被创建)
    21. synchronized (SingletonTest.class) {
    22. //未初始化,则初始instance变量
    23. if (instance == null) {
    24. instance = new SingletonTest();
    25. }
    26. }
    27. }
    28. return instance;
    29. }
    30. }

    方法四为单例模式的最佳实现。内存占用地,效率高,线程安全,多线程操作原子性。

  • 事实上,可以通过Java反射机制来实例化private类型的构造方法,此时基本上会使所有的Java单例实现失效。本帖不讨论反射情况下问题,默认无反射,也是常见的面试已经应用场景

参考:吟啸且徐行 菜鸟教程

java设计模式(二)单例模式,一生只爱一人,只争一朝一夕的更多相关文章

  1. java 设计模式之单例模式

    -------Success is getting what you want, happiness is wanting what you get. java设计模式之单例模式(Singleton) ...

  2. Java 设计模式(二)-六大原则

    Java 设计模式(二)-六大原则 单一职责原则(Single Responsibility Principle) 定义: 不要存在多余一个原因导致类变更,既一个类只负责一项职责. 问题由来: 当类A ...

  3. 折腾Java设计模式之单例模式

    博文原址:折腾Java设计模式之单例模式 单例模式 Ensure a class has only one instance, and provide a global point of access ...

  4. Java 设计模式之单例模式(一)

    原文地址:Java 设计模式之单例模式(一) 博客地址:http://www.extlight.com 一.背景 没有太多原由,纯粹是记录和总结自己从业以来经历和学习的点点滴滴. 本篇内容为 Java ...

  5. java设计模式之单例模式你真的会了吗?(懒汉式篇)

    java设计模式之单例模式你真的会了吗?(懒汉式篇) 一.什么是单例模式? 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供 ...

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

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

  7. java设计模式1——单例模式

    java设计模式1--单例模式 1.单例模式介绍 1.1.核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 1.2.常见场景 1.3.单例模式的优点 1.4.常见的五种单例模式实现 ...

  8. [java设计模式]之单例模式

    -------------------此部分比較深入地解说了单例模式,原文链接已给出.兴许将涉及一些常见面试问题--------------------------- 原文地址:http://www. ...

  9. 深入探索Java设计模式之单例模式

    单例模式可确保在给定的时间实例中只能创建一个具有全局访问点的对象.这是面向对象编程中最常用的技术之一.尽管它很简单,但从类设计的角度来看可能是最简单的,但是在尝试实现它们之前,必须先解决一些细微的问题 ...

随机推荐

  1. AE ArcEngine10.4+vs2012安装配置

    准备内容 安装环境:win10*64位专业版,ArcGIS_Desktop_1041_151727,C#语言环境,visual studio2012 安装文件:ArcGIS_Engine_1041_1 ...

  2. toString() 方法的参数

    除开null 和 undefined之外所有的数据类型都是拥有toString方法的. 通常情况下我们使用toString()方法的时候都是不用传递参数的,但是Number类型的toString方法是 ...

  3. day 28 黏包 ssh模块 subprocess模块

    套接字的信仰 一切皆文件 昨日作业: import socket sock=socket.socket() # TCP协议 IP_PORT=("127.0.0.1",8899) s ...

  4. RobotFramework自动化测试框架-Selenium Web自动化(三)关于在RobotFramework中如何使用Selenium很全的总结(下)

    本文紧接着RobotFramework自动化测试框架-Selenium Web自动化(二)关于在RobotFramework中如何使用Selenium很全的总结(上)继续分享RobotFramewor ...

  5. word2vec:主要概念和流程

    1.单词的向量化表示 一般来讲,词向量主要有两种形式,分别是稀疏向量和密集向量. 所谓稀疏向量,又称为one-hot representation,就是用一个很长的向量来表示一个词,向量的长度为词典的 ...

  6. Fragment事务管理源码分析

    转载请标明出处:http://blog.csdn.net/shensky711/article/details/53132952 本文出自: [HansChen的博客] 概述 在Fragment使用中 ...

  7. python排序算法之一:冒泡排序(及其优化)

    相信冒泡排序已经被大家所熟知,今天看了一篇文章,大致是说在面试时end在了冒泡排序上,主要原因是不能给出冒泡排序的优化. 所以,今天就写一下python的冒泡排序算法,以及给出一个相应的优化.OK,前 ...

  8. python基础-并发编程part01

    并发编程 操作系统发展史 穿孔卡片 读取数据速度特别慢,CPU利用率极低 单用户使用 批处理 读取数据速度特别慢,CPU利用率极低 联机使用 脱机批处理(现代操作系统的设计原理) 读取数据速度提高 C ...

  9. Oracle SCN 详解

    一.简介 scn,system change number 在某个时间点定义数据库已提交版本的时间戳标记,Oracle为每个已提交事务分配一个唯一的scn,scn值是对数据库进行更改的逻辑时间点.sc ...

  10. mongoDB学习笔记(一)之操作符

    本文主要讲解mongoDb的一些常用的操作符的用法.随着作者本身的能力的提高,本文也会不断的完善. 官方文档链接为有: https://docs.mongodb.com/manual/referenc ...