JAVA设计模式---单例模式篇

单例模式(singleton):是JAVA中最简单的一种设计模式,属于创建型模式。所谓单例,就是整个程序有且仅有一个实例。

特点

  构造方法私有化

  在本类中实例化一个对象作为本类的属性

  对外提供一个访问本类对象的方法

饿汉式:类加载时就加载对象

应用场景:小对象,频繁用,高并发

特点:线程安全,比较常用,但容易产生垃圾,影响性能,因为一开始就初始化。

1 class Singleton{
 2     //构造方法私有化
 3     private Singleton() {
 4         System.out.println("构造方法");
 5     }
 6     //对象在类加载时初始化
 7     private static final  Singleton instance = new Singleton();
 8         //提供对外的访问方法
 9     public static Singleton getInstance() {
10         return instance;
11     }
12 }

懒汉式:对象何时需要何时创建,线程不安全

应用场景:单线程,大对象

特点:线程不安全,延迟初始化。

1 class Singleton{
 2     private Singleton() {
 3         System.out.println("构造方法");
 4     }
 5     private static Singleton instance;
 6     public static  Singleton getInstance() {
 7         if (instance == null) {
 8             instance = new Singleton();
 9         }
10         return instance;
11     }
12 }

同步锁机制

应用场景:多线程,大对象,稀少用。

特点:通过加锁保证了线程安全,性能会下降。

1 class Singleton{
 2     private Singleton() {
 3         System.out.println("构造方法");
 4     }
 5     private static Singleton instance;
 6     //同步方法,线程安全,但性能会下降
 7     public static synchronized Singleton getInstance() {
 8         if (instance == null) {
 9             instance = new Singleton();
10         }
11         return instance;
12     }
13 }

双重验证机制

应用场景:大对象,稀少用,并发量不能太大

特点:线程安全,延迟初始化。

1 class Singleton{
 2     private Singleton() {
 3         System.out.println("构造方法");
 4     }
 5     private static volatile Singleton instance;
 6     //同步方法,双重验证,减少阻塞次数,提高性能
 7     public static Singleton getInstance() {
 8         if (instance == null) {
 9             synchronized (Singleton.class) {
10                 if (instance == null) {
11                     instance = new Singleton();
12                 }
13             }
14         }
15         return instance;
16     }
17 }

静态内部类

引用场景:大对象,频繁用,高并发

特点:延时对象创建,减少资源占用,提高系统性能

1 class Singleton{
 2     private Singleton() {
 3         System.out.println("构造方法");
 4     }
 5     static class Inner{
 6         private static final  Singleton instance = new Singleton();
 7     }
 8     public static Singleton getInstance() {
 9         return Inner.instance;
10     }
11 }

枚举

1 enum Singleton{
2     //类加载时创建
3     INSTANCE;
4 }

由于单例模式是创建型模式,每次调用都会新建一个实例。那么一个重要的问题就是反序列化。当实例被写入到文件到反序列化成实例时,我们需要重写readResolve方法,以让实例唯一。

1 private Object readResolve() throws ObjectStreamException{
2         return singleton;
3 }
(0)

相关推荐

  • java中的单例模式

    单例模式是一种设计模式,这一种设计模式的目的是使得该类在整个JVM系统中只有唯一的一个实例对象,在就java开发过程中,很多场景下会碰到这种需求,所以单例模式也是最常用的设计模式之一,下面从以下几个方 ...

  • 枚举实现单例模式

    枚举实现单例模式

  • 学习单例模式引发的思考

    单例存在哪里问题? 1.单例对oop的支持不友好 OOP 四大特性: 封装 继承 多态 抽象 而单例这种设计模式对于其中的抽象 继承 多态 都支持的不好 为什么这么说呢? 我们先来看一个单例的例子 p ...

  • Java设计模式-单例模式

    单例模式的定义 在<Java与模式>书中这样说到:作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式的特点 从单例模 ...

  • Java设计模式之单例模式

    单例模式,是特别常见的一种设计模式,因此我们有必要对它的概念和几种常见的写法非常了解,而且这也是面试中常问的知识点. 所谓单例模式,就是所有的请求都用一个对象来处理,如我们常用的Spring默认就是单 ...

  • 设计模式 - Java中单例模式的6种写法及优缺点对比

    目录 1 为什么要用单例模式 1.1 什么是单例模式 1.2 单例模式的思路和优势 2 写法① - 饥饿模式 2.1 代码示例 2.2 优缺点比较 3 写法② - 懒惰模式 3.1 代码示例 3.2 ...

  • Java基础知识篇(2020最新版) 准备放进收藏夹吃灰的勿进

    Java基础知识篇(2020最新版) 准备放进收藏夹吃灰的勿进

  • Java基础总结(学Java这一篇就够了)

    2021-02-03 22:07:31 目录 java基础总结 一.java基础知识 1.DOS和Java特性 2.Java--集成开发环境 3.java程序的编译和运行.JDK.JRE.JVM的关系 ...

  • Java设计模式【命令模式】

    命令模式 命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行.这个过程好在,三者相互解耦,任何一方都不 ...

  • 免费下载《Java设计模式(第2版)》.pdf

    回复"面试"获取全套面试资料 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用. 设计模式是软件开发人员在软件开发过程中面临的一 ...

  • 设计模式-单例模式

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

  • 【JAVA并发第二篇】Java线程的创建与运行,线程状态与常用方法

    【JAVA并发第二篇】Java线程的创建与运行,线程状态与常用方法