首页
学习
活动
专区
圈层
工具
发布

单例方法

基础概念

单例模式(Singleton Pattern)是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点来访问该实例。单例模式通常用于控制资源的共享,例如数据库连接池、日志记录器、配置管理等。

优势

  1. 全局唯一性:确保系统中只有一个实例,避免重复创建和资源浪费。
  2. 延迟加载:可以在需要时才创建实例,节省系统资源。
  3. 线程安全:通过适当的实现方式,可以确保多线程环境下的安全性。

类型

  1. 懒汉式单例:在第一次使用时才创建实例。
  2. 饿汉式单例:在类加载时就创建实例。
  3. 双重检查锁定单例:结合懒汉式和饿汉式的优点,既保证线程安全,又实现延迟加载。
  4. 静态内部类单例:利用Java的类加载机制,实现延迟加载和线程安全。
  5. 枚举单例:利用Java枚举的特性,实现简单且线程安全的单例模式。

应用场景

  1. 数据库连接池:确保系统中只有一个数据库连接池实例。
  2. 日志记录器:确保系统中只有一个日志记录器实例。
  3. 配置管理:确保系统中只有一个配置管理实例。
  4. 缓存管理:确保系统中只有一个缓存管理实例。

示例代码

以下是一个懒汉式单例模式的示例代码:

代码语言:txt
复制
public class Singleton {
    private static Singleton instance;

    private Singleton() {
        // 私有构造函数,防止外部实例化
    }

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

双重检查锁定单例模式的示例代码:

代码语言:txt
复制
public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {
        // 私有构造函数,防止外部实例化
    }

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

枚举单例模式的示例代码:

代码语言:txt
复制
public enum Singleton {
    INSTANCE;

    public void doSomething() {
        // 业务逻辑
    }
}

常见问题及解决方法

  1. 线程安全问题:
    • 使用synchronized关键字或双重检查锁定来确保线程安全。
    • 使用静态内部类或枚举来实现线程安全的单例模式。
  • 性能问题:
    • 使用双重检查锁定或静态内部类来减少同步的开销。
    • 枚举单例模式在Java中性能较好,且实现简单。
  • 序列化和反序列化问题:
    • 确保单例类实现Serializable接口,并重写readResolve方法来防止序列化和反序列化时创建新的实例。
代码语言:txt
复制
public class Singleton implements Serializable {
    private static final long serialVersionUID = 1L;

    private Singleton() {
        // 私有构造函数,防止外部实例化
    }

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

    protected Object readResolve() {
        return getInstance();
    }
}

参考链接

希望这些信息对你有所帮助!

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python笔记:单例实现方法

单例的实现方法 如前所述,单例的实现方式事实上就是对类的实例化过程进行介入,重载其中某些过程,使得当类的实例以及存在时,直接返回已经实例化的类的实例,从而确保这一个类的实例对象永远为同一个。...而根据介入时间点的不同,单例的实现方式大致可以分为以下三种,由前至后分别为: 通过装饰器方式重载类的实例化方法 重载元类的__call__方法 重载类的__new__方法 1....通过装饰器的方式实现 通过装饰器的方式进行单例的实现事实上就是完全重载类的实例化方法。...通过重载类的__new__函数的方式实现 单例的第三类实现方式是通过重载类的__new__()方法进行实现。...根据介入时间点的不同,单例的实现方式大致可以分为以下三种,由前至后分别为: 通过装饰器方式重载类的实例化方法 重载元类的__call__方法 重载类的__new__方法 给出各个模式下的单例在二次实例化过程中会进行的操作如下

84230

Java单例---反射攻击破坏单例和解决方法

之前写过几篇单例的文章: Java单例—双重锁校验详解 Java单例—序列化破坏单例模式原理解析 Java单例—静态内部类 在静态内部类中引出了反射攻击的问题,本篇就来说一下反射攻击,废话不多少说上代码...InnerClass.staticInnerClass; } private StaticInnerClass(){ //构造器判断,防止反射攻击,大家可以在下面这行if判断打断点来测试一下这个方法的过程...但是如果不是在类加载的时候创建对象实例的这种单例,是没有办法防止反射攻击的,比如之前写过的那个双重锁校验,使用这种在构造器判断方式是无效的,来段代码证明一下,先上双重锁校验的构造器判断方式代码: import...还有一种尝试解决这种反射攻击的是:在单例里面加标识属性,如果实例化之后,标识改变,在构造器里面判断标识改变就抛异常,和上面这种气势差不多,但是没用的,反射可以把构造器的权限放开,同样可以把属性的权限放开...,并且修改属性值,所以这种方式也是不行的,我还是写一下这个代码吧,方便大家理解,首先上加了标识属性的单例: import java.io.Serializable; /** * 双重锁校验的单例

68830
  • 单例模式【单例设计模式】

    单例模式的特点 单例类只有一个实例对象; 该单例对象必须由单例类自行创建; 单例类对外提供一个访问该单例的全局访问点。...单例模式的优点和缺点 单例模式的优点 单例模式可以保证内存里只有一个实例,减少了内存的开销。 可以避免对资源的多重占用。 单例模式设置全局访问点,可以优化和共享资源的访问。...第 1 种:懒汉式单例 该模式的特点是类加载时没有生成单例,只有当第一次调用 getlnstance 方法时才去创建这个单例。...代码如下: //该模式的特点是类加载时没有生成单例,只有当第一次调用 getlnstance 方法时才去创建这个单例。...该模式的特点是类一旦加载就创建一个单例,保证在调用 getInstance 方法之前单例已经存在了。

    2.5K20

    单例

    new实现单例 new至少要有一个参数cls,代表要实例化的类,new方法负责创建一个实例对象,在对象被创建的时候调用该方法它是一个类方法,new方法负责创建一个实例对象,在对象被创建的时候调用该方法它是一个类方法...new方法在返回一个实例之后,会自动的调用init方法,对实例进行初始化。如果new方法不返回值,或者返回的不是实例,那么它就不会自动的去调用init方法。..._instance 元类实现单例 class Singleton(type): def __init__(self, *args, **kwargs): print "__init...__instance class Foo(object): __metaclass__ = Singleton #在代码执行到这里的时候,元类中的__new__方法和__init__方法其实已经被执行了...只有再需要对原类做变动时才需要写new方法 为了更好理解上面单例,注意下面两种写法 class UpperAttrMetaClass(type): def __new__(upperattr_metaclass

    91740

    单例模式《单例模式概念、什么时候能用到单例模式、单例模式的好处》

    目录 一、单例模式的概念 1.类每次实例化的时候都会创建一个新的对象,如果要求类只能被实例化一次该怎么做呢? 二、什么时候能用到单例模式?...三、单例模式的好处 1.单例模式好处 2.代码目录结构 一、单例模式的概念 1.类每次实例化的时候都会创建一个新的对象,如果要求类只能被实例化一次该怎么做呢?...图片来自网络 单例模式: 就是我们创建一个类,这个类只能被实例化一次,也就是说这个类只能创建出来一个实例对象,这种叫做单例模式。 二、什么时候能用到单例模式?...三、单例模式的好处 1.单例模式好处 不管你实例化多少次,它始终只返回第一次创建的对象。不管你什么时候创建,它始终返回这一个对象。...比如在这个qh_05day_01.py里面实现了一个单例模式: # 1、多个装饰器装饰同一个函数 # 2、python中类里面三个内置的装饰器 # 3、用类实现装饰器 import time def

    2.6K20

    【Kotlin】Kotlin 单例 ( 懒汉式 与 恶汉式 | Java 单例 | Kotlin 单例 | 对象声明 | 伴生对象 | get 方法 | ? 与 !! 判空 )

    单例类特点 : ① 私有静态化单例成员变量 ; ② 私有化构造函数 ; ③ 公共静态获取单例方法 ; 详细的 Java 与 Kotlin 单例示例详细看下面的四个示例 II ....Kotlin 懒汉单例模式 : 该示例中涉及到了伴生对象 , 字段 getter 方法定义 , ? 和 !!...} } //调用单例方法测试 fun main() { //伴生对象方法 可以直接使用 Student.伴生对象方法 进行调用 //学习 Student.study...单例调用 : 可以直接使用类调用伴生对象的方法 , 上述定义的 Student 类 及伴生对象 , Student 与 Student.Companion 是等价的 ; 因此测试时 , 下面的两个方法都是调用伴生对象的方法...; //调用单例方法测试 fun main() { //伴生对象方法 可以直接使用 Student.伴生对象方法 进行调用 //学习 Student.study()

    1.8K20

    关于python单例的常用几种实现方法

    这两天在看自己之前写的代码,所以正好把用过的东西整理一下,单例模式,在日常的代码工作中也是经常被用到, 所以这里把之前用过的不同方式实现的单例方式整理一下 装饰器的方式 这种方式也是工作中经常用的一种,...instance[cls] = cls(*args, **kwargs) return _instance[cls] return _singleton 如果我们工作的一个类需要用单例就通过类似下面的方式实现即可..._instance 乍一看这个类好像已经实现了单例,但是这里有一个潜在的问题,就是如果是多线程的情况,这样写就会有问题了,尤其是在当前类的初始化对象里有一些耗时操作时候 例如下面代码: #!...range(5): t = threading.Thread(target=task, args=[i,]) t.start() 这段代码的执行结果会出现实例化了多个对象,导致你写的单例就没起到作用..._instance 这样就很好的实现一个可以多线程使用的单例

    75720

    Java 实现单例模式的 9 种方法

    什么是单例模式 二. 单例模式的特点 三. 单例模式VS静态类 四. 单例模式的实现 ---- 一....,这里我会将单例模式和静态类进行一个比较。 单例可以继承和被继承,方法可以被override,而静态方法不可以。 静态方法中产生的对象会在执行后被释放,进而被GC清理,不会一直存在于内存中。...getInstance()方法来给予访问者一个单例。...枚举单例这种方法问世以来,许多分析文章都称它是实现单例的最完美方法——写法超级简单,而且又能解决大部分的问题。...线程A获取到了单例实例并返回,线程B没有获取到单例并返回Null。 理论上双重校验锁法是线程安全的,并且,这种方法实现了lazyloading。

    1.4K40

    单例模式

    单例模式 单例模式Singleton Pattern又名单件模式或单态模式,属于创建型模式,其涉及到一个单一的类,该类负责创建所需的对象,同时确保只有单个对象被创建,这个类提供了一种访问其唯一的对象的方式...描述 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。...单例模式主要有以下要点,首先是某个类只能有一个实例,再是其必须自行创建这个实例,以及其必须自行向整个系统提供这个实例。 模式结构 * Singleton: 单例。 * Proxy: 单例创建代理。...我们可以基于单例模式进行扩展,使用与单例控制相似的方法来获得指定个数的对象实例。 缺点 * 由于单例模式中没有抽象层,因此单例类的扩展有很大的困难。...* 单例类的职责过重,在一定程度上违背了单一职责原则。因为单例类既充当了工厂角色,提供了工厂方法,同时又充当了产品角色,包含一些业务方法,将产品的创建和产品的本身的功能融合到一起。

    1.6K10

    单例模式

    1.2、单例模式模式四要素 私有的构造方法 私有克隆方法 指向自己实例的私有静态引用 以自己实例为返回值的静态的公有的方法 1.3、单例模式根据实例化对象时机的不同分为两种   一种是饿汉式单例,饿汉式单例在单例类被加载时候...,就实例化一个对象交给自己的引用;   一种是懒汉式单例,而懒汉式在调用取得实例方法的时候才会实例化对象。...> 3、融合memcached的单例模式   想到memcached能够存储对象,灵光一闪如果将实例化的对象存储在memcached内存中,需要就拿出来。...那样就可以避免每次循环执行脚本都要实例化,这不就从单例模式的基础上更进一步了么。   撸起袖子那就开干啦,下面的代码就是将memcached融合到了单例模式中的类。...php 2 #单例模式+memcached(使用内存的单例模式) 3 class Singleton 4 { 5 private static $_instance; 6 private

    1.1K30

    单例模式

    简介 单例模式(Singleton Pattern)保证一个类只有一个实例,并提供一个访问它的全局访问点。 单例模式是一种对象创建型模式 (可参考 设计模式 创建型模式)。...单例模式是设计模式中最简单的模式。它的用途就是使得类的一个对象成为系统中的唯一实例。...图-单例模式结构图 Singleton : 定义一个接口 Instance() 使得客户端可以访问它的唯一实例。...单例模式的类只能提供私有的构造函数。如此,才能保证外部无法实例化这个类的对象。 3、必须提供获取实例的方法。 单例模式的类必须提供一个公共的静态函数用于创建或获取它本身的静态私有对象。...继续向下执行,会生成两个实例,违背了单例模式的初衷。

    2K90
    领券