`

单例模式 Singleton的实现

 
阅读更多

1. 非lazy模式

//Singleton with static factory
class SingletonExample {

    private static final SingletonExample singleton = new SingletonExample();

    private SingletonExample() {
    }

    public static final SingletonExample getInstance() {
        return singleton;
    }
}

 

2. lazy模式的实现 (效率很低)

class SingletonExample {
    private static SingletonExample singleton;

    private SingletonExample() {
    }

    public synchronized SingletonExample getInstance() {
        if (singleton == null) {
            singleton = new SingletonExample();
        }
        return singleton;
    }
}

 

3. 高效的lazy模式的实现

class SingletonExample {
    private static SingletonExample singleton;

    private SingletonExample() throws Exception {
    }

    public static SingletonExample getInstance() {
        if (singleton == null) {    // the calls arriving after singleton is created will not enter this branch, this line is not synchronized, so they won’t lock each other.
            synchronized (SingletonExample.class) {    // for the first call, we still have to lock it
                if (singleton == null) {
                    try {
                        singleton = new SingletonExample();
                    } catch (Exception e) {

                    }
                }
            }
        }
        return singleton;
    }
}

 

4. 以上所有设计在两种情况下都及其脆弱:

其一,Java Reflection attack,比如:

public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        Class<?> clazz = Class.forName("test.SingletonExample");
        Constructor<?> constructor = clazz.getDeclaredConstructor();
        constructor.setAccessible(true);
        SingletonExample singleton1 = (SingletonExample)constructor.newInstance();
        SingletonExample singleton2 = (SingletonExample)constructor.newInstance();
}

其二,如果单例需要序列化,在反序列化的时候单例会被破坏。

 

5. 推荐的解决方案使用 enum代替class来写单例

public enum SingletonExample {
    INSTANCE;
   
    public static SingletonExample getInstance() {
        return INSTANCE;
    }
}

按照Effective Java的结论,这种方法 简介,使用了由JDK为enum提供的特殊的序列化机制,在面对复杂的序列化和反序列化的时候能够有效的防止被多次实例化。另外enum的的构造器一定是private的,而且其构造器仅对内部成员可见,在运行时外部类是没办法看到这个构造器的(比private严格得多),所以无法利用常规反射手段将其设为public.

分享到:
评论

相关推荐

    单例模式 Singleton Pattern

    ### 单例模式 Singleton Pattern #### 概述 单例模式是一种常见的设计模式,属于创建型模式之一。这种模式的核心在于确保某个类只有一个实例存在,并且提供一个全局访问点来获取该实例。单例模式在Java开发中尤其...

    单例模式(singleton)

    实现单例模式的关键在于防止其他对象通过常规构造函数创建新的实例。这通常通过私有化构造函数和提供一个公共静态方法(称为单例工厂方法)来实现。在Java中,单例模式的实现有多种方式: 1. 饿汉式(Static ...

    单例模式(Singleton)的6种实现

    单例模式(Singleton)是设计模式中最简单也是最有争议的一个模式。它主要解决的问题是确保一个类仅有一个实例,并提供一个全局访问点。单例模式适用于那些需要全局访问的场景,比如线程池、缓存、配置对象等。单例...

    单例模式各种实现方式

    在Java中,实现单例模式有多种方法,每种都有其特定的优缺点和适用场景。以下是几种常见的单例模式实现方式: 1. **饿汉式(静态常量)**: 这是最简单的实现方式,它在类加载时就完成了初始化,因此是线程安全的...

    单例模式Java实现

    在Java中,我们可以使用多种方式来实现单例模式: 1. **饿汉式(静态常量)**:这是最简单的单例实现方式,它在类加载时就完成了初始化,所以类加载比较慢,但获取对象的速度快,且线程安全。 ```java public class...

    设计模式C++学习之单例模式(Singleton)

    在C++中,实现单例模式有多种方法,我们将会深入探讨这一模式的原理、优缺点以及如何在实际编程中应用。 单例模式的核心在于控制类的实例化过程,防止多处代码创建多个实例导致资源的浪费或者状态不一致的问题。在...

    Qt qml Singleton 单例模式

    在Qt的Qml环境中,单例模式是一种设计模式,它允许在整个应用程序中创建一个全局访问点,确保某个类只有一个实例存在。这样的设计模式在需要共享数据或者服务时非常有用,避免了多处创建相同对象导致的数据不一致或...

    单例 模式 singleton

    下面将详细阐述单例模式的实现方式、优化策略以及线程安全问题。 1. 最简单的实现(饿汉式) 最基础的单例模式实现是"饿汉式",即在类加载时就创建实例。这种方式确保了在任何时刻只有一个实例存在,但同时也意味着...

    使用C++11实现线程安全的单例模式

    这个程序会输出"Both references point to the same singleton instance.",证明了单例模式的正确实现。 总结来说,C++11通过`std::mutex`和`std::call_once`等工具,为实现线程安全的单例模式提供了强大支持。这种...

    单例模式PHP实现代码类.zip

    下面详细阐述单例模式的原理及其PHP实现: 1. **单例模式的基本概念**: - 单例模式的主要目的是限制类的实例化次数,确保任何时候都只有一个实例存在。 - 这个唯一实例可以通过一个全局访问点获取,通常是类的...

    单例模式Singleton

    单例模式(Singleton Pattern)是一种常用的软件设计模式,它的核心思想是确保一个类在整个应用程序中只有一个实例存在,并提供一个全局访问点来获取这个实例。这种模式在很多场景下非常有用,比如管理系统资源、...

    设计之模式之单例(Singleton)

    2. **单例模式的实现方式** - **懒汉式**:延迟加载,只有在首次使用时才创建实例。这种方式在Java中需要注意线程安全问题,例如双重检查锁定(Double-Checked Locking)。 - **饿汉式**:类加载时就立即创建实例...

    C++实现Singleton单例模式

    C++实现Singleton单例模式 本文档将详细介绍如何使用C++语言实现设计模式中的单例模式。单例模式是一种常用的设计模式,它可以确保一个类只能实例化一次。 单例模式的定义: 单例模式是一种创建型模式,它可以确保...

    大话设计模式--Singleton(单例模式)

    本文将深入探讨单例模式的概念、作用、实现方式以及其在实际编程中的应用。 单例模式的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这种模式主要用于控制类的实例化过程,防止因为多个实例导致的资源...

     单例设计模式Singleton1

    饿汉式单例模式的实现方式是,在类加载时就初始化实例对象,并将其保存在静态变量中。优点是写起来比较简单,而且不存在多线程同步问题,避免了synchronized所造成的性能问题;缺点是:当类被加载的时候,会初始化...

    深入浅出单例Singleton模式

    1. **线程安全**:确保在多线程环境下,单例模式的实现能够正确处理并发问题,避免产生多个实例。 2. **序列化**:如果单例类实现了`Serializable`接口,需要处理反序列化时可能创建新实例的问题,通常在`...

    c#单例模式(Singleton)的6种实现

    如:IO处理,数据库操作等,由于这些对象都要占用重要的系统资源,所以我们必须限制这些实例的创建或始终使用一个公用的实例,这就是我们今天要介绍的——单例模式(Singleton)。  使用频率高 单件模式(Singleton...

    ios播放单例类 singleton

    单例模式确保类只能有一个实例,并且提供一个全局访问点。在Objective-C中,通常通过以下方式实现: ```objc + (instancetype)sharedManager { static SoundManager *sharedInstance = nil; static dispatch_once...

    java单例模式实例

    在Java中,有多种实现单例模式的方法,每种都有其特点和适用场景。接下来,我们将深入探讨这些实现方式。 首先,我们来看**懒汉式(Lazy Initialization)**。这种实现方式是在类被首次请求时才创建单例对象,延迟...

Global site tag (gtag.js) - Google Analytics