`
sunlong
  • 浏览: 85702 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

单例的实现

    博客分类:
  • Java
阅读更多

很多java面试喜欢考单例模式,网上也一大堆文章。在这里也自己实现一次,作个纪念。

import java.io.*;

/**
 * User: sunlong
 * Date: 13-9-29
 * Time: 下午3:55
 */
public class Singleton {
    private static Singleton singleton = new Singleton();
    private Singleton(){}

    public static Singleton getInstance(){
        return singleton;
    }
}

/**
 * 饿汉式
 * 非线程安全实现
 */
class Singleton2{
    private Singleton2(){}

    private static Singleton2 singleton;

    public static Singleton2 getInstance(){
        if(singleton == null){
            singleton = new Singleton2();
        }
        return singleton;
    }
}

/**
 * 线程安全,但性能很糟糕
 */
class Singleton3{
    private Singleton3(){}

    private static Singleton3 singleton;

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

/**
 * 双检查锁
 * 可能会失效,因为同步块外面的if (singleton == null)可能看到已存在,但不完整的实例。
 * 一篇参考文章
 * http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
 */
class Singleton4{
    private Singleton4(){}

    private static Singleton4 singleton; //JDK5.0以后版本若singleton为volatile则可行

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

/**
 * 使用内部类实现延迟加载
 * 线程安全
 */
class Singleton5 {
    private static class Singleton5Holder {
        final static Singleton5 INSTANCE = new Singleton5();
    }

    private Singleton5 (){
    }

    public static Singleton5 getInstance() {
        return Singleton5Holder.INSTANCE;
    }
}

/**
 * 为了使Singleton类变成可序列化的(serializable),
 * 仅仅实现Serializable接口是不够的。为了维护 Singleton的单例性,你必须给Singleton类提供一个readResolve方法,
 * 否则的话,一个序列化的实例,每次反序列化的时候都会产 生一个新的实例。Singleton 也不会例外。
 */
class Singleton6 implements Serializable{
    private static Singleton6 singleton = new Singleton6();
    private Singleton6(){}

    public static Singleton6 getInstance(){
        return singleton;
    }

//    private Object readResolve() throws ObjectStreamException {
//        return singleton;
//    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:\\Singleton.obj"));
        Singleton6 singleton = Singleton6.getInstance();
        objectOutputStream.writeObject(singleton);
        objectOutputStream.close();
        //反序列化
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("D:\\Singleton.obj"));
        Singleton6 singleton2 = (Singleton6)objectInputStream.readObject();
        objectInputStream.close();
        //比较是否原来的实例
        System.out.println(singleton==singleton2);
    }
}

 

分享到:
评论

相关推荐

    两种单例实现方式

    两种单例实现方式 单例模式是指一个类只有一个实例,并且提供了一个全局的访问点来访问该实例。单例模式是一种常用的设计模式,它可以确保某个类只有一个实例,并且提供了一个全局的访问点来访问该实例。 在 Java ...

    Qt多工程调用单例实现,带线程锁

    标题中的"Qt多工程调用单例实现"意味着我们在多个独立的Qt工程之间共享同一对象实例。这通常是通过将单例类作为库或模块提供,然后在各个工程中引入和使用。在给定的资源中,"DataSource"很可能就是这样的单例类,...

    单例实现源码singleton-C++

    以下是对"单例实现源码singleton-C++"的详细解析。 1. **静态成员变量法** 这是最常见的单例实现方式。在类中定义一个静态成员变量,该变量保存唯一的实例。例如: ```cpp class Singleton { public: static ...

    Qt Quick application单例实现

    以下是一个基本的Qt Quick应用单例实现步骤: 1. **定义单例类**: 创建一个继承自`QObject`的C++类,例如`MySingleton`。 ```cpp #include class MySingleton : public QObject { Q_OBJECT public: explicit ...

    asp.net中c++单例实现问题分析__1.docx

    ##### 非线程安全的单例实现 ```cpp class QMManager { public: static QMManager instance() { static QMManager instance_; return instance_; } }; ``` 此段代码中,`static QMManager instance_;` 在第一次...

    数据库单例实现

    这是Java特有的单例实现方式,线程安全,且防止反序列化重新创建实例。 ```java public enum DatabaseSingleton { INSTANCE; public void connectDB() { // 连接数据库的逻辑 } } ``` 以上就是数据库单例模式...

    单例模式的几种实现方式

    每种实现方式都有其适用场景,开发者应根据实际需求选择合适的单例实现。例如,如果项目对性能要求较高,可考虑使用静态内部类或枚举;如果对内存占用有要求,可以考虑饿汉式。在多线程环境中,务必保证单例的线程...

    FixedThreadPool线程池的单例实现

    内含线程池的单例的详细过程,对线程池的学习有着重要参考价值

    Python使用redis pool的一种单例实现方式

    在`__main__`模块中,我们展示了如何使用这个单例实现的`RedisCache`类进行数据的设置、获取和删除。每次调用`RedisCache`的实例方法时,实际上都是操作同一个连接池中的连接,从而有效地减少了创建和销毁连接的开销...

    单例模式各种实现方式

    每种实现方式都有其特点和适用场景,开发者应根据实际需求选择合适的单例实现。在实际项目中,还要考虑性能、线程安全以及代码可读性等因素。例如,如果项目中对性能要求较高,可以优先考虑静态内部类或枚举实现;...

    设计模式——单例实现

    单例的5中实现及反射和反序列化破解单例。

    单例模式Java实现

    1. **饿汉式(静态常量)**:这是最简单的单例实现方式,它在类加载时就完成了初始化,所以类加载比较慢,但获取对象的速度快,且线程安全。 ```java public class Singleton { private static final Singleton ...

    43丨单例模式(下):如何设计实现一个集群环境下的分布式单例模式?1

    单例模式是一种设计模式,旨在确保一个类只有一个实例,并提供全局访问点。在单例模式中,类的构造函数是私有的,防止外部直接创建对象,而是通过静态...在实际应用中,应根据系统的需求和环境选择合适的单例实现方式。

    应用程序单例实现Demo

    一个实现应用程序单例打开的Demo。用到了PostMessage和接收消息的方法。对应博文:https://blog.csdn.net/lanwilliam/article/details/81455176

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

    饿汉式是一种简单的单例实现方式。在类加载时,单例对象就已经创建。这种实现方式的优点是实现简单,但缺点是不管是否使用,单例对象都会被创建。 2. 懒汉式(Lazy Initialization) 懒汉式单例模式延迟了单例实例...

    C++实现的单例模式代码

    这是最简单的单例实现方式,通过类内部定义一个静态私有实例和公有的静态获取实例的方法。如下所示: ```cpp class Singleton { private: Singleton() {} ~Singleton() {} Singleton(const Singleton&) = delete...

    7种单例模式

    这是最简单的单例实现,它在类加载时就创建了实例,因此是线程安全的。 ```java public class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public ...

    Java中的五种实现方法【单例模式】

    这是最简单的单例实现方式,它在类加载时就完成了初始化,所以是线程安全的。饿汉式的优点是实现简单且线程安全,但缺点是如果单例对象长时间未被使用,会占用内存资源。 ```java public class Singleton { ...

    VC2010工厂模式和单例模式的实现

    自己用VC2010写的工厂模式和单例模式的实现

Global site tag (gtag.js) - Google Analytics