单例模式

简介: 什么是单例模式?在一个项目中,单例模式确保某一个类只能有一个实例,这个类称为单例类。怎样确保某个类只能有一个实例,通常调用方法有两种方式: 创建类的一个对象,即new出一个对象,用该对象去调用类中方法; 使用类名直接调用类中方法,格式“类名.方法名()”想要类只有一个实例,必不能随意通过new出对象,禁止new对象就只能私有化构造方法,采用“类名.方法名()”这种方式获取方法。

什么是单例模式?在一个项目中,单例模式确保某一个类只能有一个实例,这个类称为单例类。
怎样确保某个类只能有一个实例,通常调用方法有两种方式:

  1. 创建类的一个对象,即new出一个对象,用该对象去调用类中方法;
  2. 使用类名直接调用类中方法,格式“类名.方法名()”
    想要类只有一个实例,必不能随意通过new出对象,禁止new对象就只能私有化构造方法,采用“类名.方法名()”这种方式获取方法。通过类名对用方法,此方法是属于类的方法,由于类的加载顺序限定,此方法必须是静态(static)的,且方法里的属性也必须是静态的。

单例核心三要素:

  1. 构造方法私有化
  2. 提供静态(static)的得到类对象的方法
  3. 类属性设为static

单例模式根据对象的创建时间不同,有分为EagerSingleton和LazySingleton。
EagerSingleton方法:

public class EagerSingleton {
    /** 静态方法访问静态成员变量*/
    private static EagerSingleton instance = new EagerSingleton();
    /** 私有构造方法,防止被实例化 */
    private EagerSingleton(){
    }
    /** 提供调用的方法 */
    public static EagerSingleton getInstance(){
        return instance;
    }
}

EagerSingleton方法缺点是该类加载的时候就会直接new 一个静态对象,当系统中单例类较多时,会使得启动速度变慢。
LazySingleton方法:

public class LazySingleton {
    //非线程安全
    private static LazySingleton instance = null;
    private LazySingleton(){
    }
    public static LazySingleton getInstance1(){
        if(instance == null){
            instance = new LazySingleton();
        }
        return instance;
    }
}

提供双重锁写法,保证线程安全:

public class DoubleCheckLock {

    private volatile static DoubleCheckLock instance = null;

    private DoubleCheckLock(){
    }

    public static DoubleCheckLock getInstance(){
        if(instance == null){
            synchronized (DoubleCheckLock.class) {
                if(instance == null)
                    instance = new DoubleCheckLock() ;
            }
        }
        return instance;
    }
}

“双重检查加锁”机制是当每次执行getInstance方法时先不同步,先检查instance是否存在,如果不存在才进行加锁,这是第一重检查;进入同步块synchronized 方法后,再次检查实例是否存在,如果不存在就创建实例instance,这是第二重检查。DoubleCheckLock 机制使用关键字volatile,被volatile修饰的变量值不会被本地线程缓存,所有对该变量的读写都是直接操作共享内存,从而确保多个线程能正确的操作该变量。

参考:
1.https://www.cnblogs.com/java-my-life/archive/2012/03/31/2425631.html

目录
相关文章
|
8月前
|
设计模式 安全 Java
单例模式
​ 如有错误或有补充,以及任何的改进意见,请在评论区留下您的高见,同时文中给出大部分的示例 如果觉得本文写的不错,不妨点个赞,收藏一下,助力博主产生质量更高的作品 概念 单例模式(Singleton Pattern)是软件设计模式的一种,用于确保一个类只有一个实例,并提供一个全局访问点。这种模式通常用于需要频繁创建和销毁同一对象的场景,以减少系统资源的消耗和提高性能。 优缺点 优点: 实例控制:单例模式确保类只有一个实例,可以防止其他对象实例化自己的副本,从而确保所有对象都访问唯一实例。 节约资源:由于系统中只存在一个对象,可以节约系统资源,特别是在需要频繁创建和销毁对象的场景中,可
66 0
|
8月前
|
C++
【C++ 单例模式】
【C++ 单例模式】
找对象需要单例模式吗?
单例模式的类只提供私有的构造函数
|
设计模式 C#
C# 机房重构单例模式
C# 机房重构单例模式
73 0
|
SQL 安全 Java
五种单例模式介绍
五种单例模式介绍
95 0
|
设计模式 缓存 JSON
没那么简单的单例模式
没那么简单的单例模式
131 0
没那么简单的单例模式
|
SQL 安全 Java
单例模式的理解
谈谈你对单例模式的理解。也算是老生常谈的问题了~~~
1065 1
|
XML 设计模式 安全
单例模式,真不简单
单例模式,真不简单
单例模式,真不简单
|
设计模式 开发框架 Java
单例模式7种实现
单例模式7种实现
154 0
|
设计模式 安全 Java
单例模式中的那些坑
本章内容涉及到java多线程,类加载机制,JVM指令重排,final以及volatile的区别,序列化问题,java反编译,反射创建对象机制等相关问题. 需要读者具备一定的Java相关基础.
5014 0
单例模式中的那些坑