单例模式

3个要点:私有的静态成员变量;私有的构造函数;公开的获取单例的静态方法

懒汉式

在需要使用到的时候才创建,所以被称之为懒汉式。

示例代码如下:

public class Singleton {// 懒汉式private static Singleton singleton = null;// 私有构造函数private Singleton() {}public static Singleton getInstance(){if (singleton == null){singleton = new Singleton();}return singleton;}public static void main(String[] args) {Singleton singleton1 = Singleton.getInstance();Singleton singleton2 = Singleton.getInstance();// 测试代码if (singleton1 == singleton2){System.out.println("singleton1 == singleton2");}}
}

输出:singleton1 == singleton2

存在的问题: 当多个线程同时调用getInstance时,不一定能够保证单例;

改进:

对方法加锁:

public class Singleton {// 懒汉式 对方法加锁private static Singleton singleton = null;// 私有构造函数private Singleton() {}// 使用synchronized 关键字对方法进行加锁,确保任意时刻只有一个线程可执行该方法synchronized public static Singleton getInstance() {if (singleton == null) {singleton = new Singleton();}return singleton;}public static void main(String[] args) {Singleton singleton1 = Singleton.getInstance();Singleton singleton2 = Singleton.getInstance();if (singleton1 == singleton2) {System.out.println("singleton1 == singleton2");}}
}

虽然解决了上述存在单例“不唯一”的问题,但是在多线程高并发访问环境中会导致系统性能大大降低

进一步改进:

无需锁方法,锁 singleton = new Singleton(); 这句代码即可。

public class Singleton {// 懒汉式// volatile 关键字会屏蔽Java虚拟机所做的一些代码优化private volatile static Singleton singleton = null;// 私有构造函数private Singleton() {}// 锁代码public static Singleton getInstance() {if (singleton == null) {synchronized (Singleton.class){if (singleton == null){   // 双重判断singleton = new Singleton();}}}return singleton;}public static void main(String[] args) {Singleton singleton1 = Singleton.getInstance();Singleton singleton2 = Singleton.getInstance();if (singleton1 == singleton2) {System.out.println("singleton1 == singleton2");}}
}

饿汉式

public class EagerSingleton {private static final EagerSingleton instance = new EagerSingleton();// 私有构造函数private EagerSingleton(){}public static EagerSingleton getInstance(){return instance;}
}

优点: 简单、线程安全

缺点:类加载时就会生成对象,浪费资源

静态内部类

java特性

public class Singleton {private Singleton() {}private static class HolderClass {private static final Singleton singleton = new Singleton();}public static Singleton getInstance(){// System.out.println("静态内部类创建");return HolderClass.singleton;}
}

Java设计模式之——单例模式相关推荐

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

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

  2. Java设计模式之单例模式的学习

    本篇是本人的第二篇博客 旨在记录本人对于Java设计模式之单例模式的学习和理解,也希望本篇可以对一些正在学习的小伙伴起到一些帮助 单例模式(singleton)的特点: 1.单例模式有且仅有一个实例: ...

  3. java设计模式之单例模式(七种方法)

    单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...

  4. Java 设计模式(3)单例模式

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

  5. java设计模式之——单例模式(八种实现)

    一.介绍 有时,我们需要某个类的实例始终只有一个,举个例子,如果用面向对象语言写的操作系统,那么桌面这个实例肯定就只有一个,无论从哪个地方进入的桌面,都是同一个. 所谓类的单例设计模式,就是采取一定的 ...

  6. Java设计模式之单例模式(Singleton Pattern)

    **单例模式:用来创造独一无二的,只能有一个实例的对象设计模式.单例模式确保一个类只有一个实例,并提供一个全局访问点.**相比于全局变量(对对象的静态引用),单例模式可以延迟实例化,而且全局变量不能保 ...

  7. Java设计模式:单例模式

    学而时习,稳固而之心, 好久没有复习java的知识了,今天有空温习了单例模式,这里记录一下 单例模式是常见的设计模式的一种,其特点就是 指一个类只有一个实例,且该类能自行创建这个实例  , 保证一个类 ...

  8. Java 设计模式之单例模式

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负责创建自己的对 ...

  9. Java设计模式(二) -- 单例模式

    单例模式是Java中最广泛应用的设计模式之一,为创建对象提供了一种绝佳的方式.因此,在一些Java程序中, 一些管理器和控制器经常被设计为单例模式. 这种模式涉及到一个单一的类,该类负责创建自己的对象 ...

  10. java设计模式学习 ----- 单例模式(Singleton)

    单例模式(Singleton) 单例对象(Singleton)是一种经常使用的设计模式. 在Java应用中,单例对象能保证在一个JVM中,该对象仅仅有一个实例存在.单例模式也分三种:懒汉式单例.饿汉式 ...

最新文章

  1. 堆空间跟栈空间的区分
  2. IDA+OD双剑合璧=逆向无敌
  3. C语言发展历史,C语言特点,C语言利于弊,入门须知三招
  4. Dart 13-Day
  5. 【蓝桥杯单片机】NE555在CT107D上的使用
  6. R语言_驾驶员事故预测
  7. mysql xa 异常_面试官问我:MySQL中的XA事务崩溃了如何恢复??
  8. 使用Q-Vision软件Kvaser硬件产品,支持ADAS测试,实现对总线网络的分析
  9. MATLAB 图像处理之图片区域显示
  10. ubuntu18.04+语音识别
  11. 法律养成——刑法(一)
  12. 《第五项修炼,学习型组织的艺术与实践》读书笔记
  13. Git 配置别名 —— 让命令变得更简单
  14. mysql8安装成功后忘记密码,密码重置
  15. RedHat / Centos   Linux 系统运维与管理实践技巧荟萃,持续更新
  16. lsdyna批处理求解工具使用
  17. python 形态学
  18. 孤狼电商店群全套教程:店群基础+2.0精细化蓝海+深度蓝海+裂变课程2.0
  19. 联想高志国:超融合已进入2.0时代
  20. centos安装aria2c_CentOS下搭建Aria2远程下载环境

热门文章

  1. 电话可以免费拨打了 福利哦
  2. Redhat5_Raid信息监控与查询_IBM(MegaCli)+HP(hpacucli)+Adaptec(arcconf)
  3. 鸿蒙系统会让运行内存增大吗,网友实测从安卓升级到鸿蒙2.0:可用内存和机身存储容量都增加了...
  4. 如何做一碗完美的葱油拌面?
  5. 安科瑞高精度开口电流互感器的规格(安科瑞-卓宋兰)
  6. 一框式检索和高级检索
  7. C#——把转义字符(\)当做普通字符处理
  8. 调起地图(高德、百度、Apple、Google)URL API
  9. Python分支结构详解(一)——分支结构基础
  10. java常量使用_在Java中使用常量的方法