`
IXHONG
  • 浏览: 451560 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

单例应该这么写

阅读更多
public class DoubleCheckSingleton {

    private volatile static DoubleCheckSingleton instance = null;

    private DoubleCheckSingleton() {}

    public static DoubleCheckSingleton getInstance() {
        //先检查实例是否存在,不存在则进入下面的同步块
        if (instance == null){
            //同步块,线程安全的创建实例
            synchronized (DoubleCheckSingleton.class) {
                //再次检查是否存在实例,如果不存在,才真正创建实例
                if (instance == null) {
                    instance = new DoubleCheckSingleton();
                }
            }
        }
        return instance;
    }

}

 Q1. instance为什么要声明为static?

 A1. static方法只能访问static属性,因为非static属性是为实例而存在的,而调用static方法不需要实例存在,所以instance必须声明为static。

 Q2. getInstance方法里可以不加同步吗?

 A2. 不可以,必须加,因为很明显存在多线程问题

 Q3. 两次判断instance==null是必要的吗?

 A3. 是非常必要的,我们在很多框架如spring中也常看到这样的写法。因为同步是有性能降低代价的,所以同步前需判断null,这个不是必须,但很必要,同步块里的则是必须的判断了。

 Q4. instance为何声明为volatile?

 A4. 线程能够自动发现volatile变量的最新值,且instance的值只有非常确定的两种情况,即null和单实例,所以instance声明为volatile,才能以最新的值判断instance==null,这是必须的。关于volatile与内存模型的解释,请看http://wely.iteye.com/blog/2324588 , http://wely.iteye.com/blog/2228828

 Q5. 在调用方法时才new instance,这叫什么模式?

 A5. 懒汉模式,或可称为懒加载模式。

 

其实,单例还有一些深藏不漏的地方 -> 单例与序列化和反射

http://wely.iteye.com/blog/2230060

http://wely.iteye.com/blog/2228826

0
0
分享到:
评论

相关推荐

    Qt之单例 - 读写配置文件

    这个类应该包含读取和写入配置文件的功能。在Qt中,我们可以使用`QSettings`类来处理配置文件的读写操作。`QSettings`提供了方便的方法来保存和加载各种数据类型,如字符串、整数、布尔值等。 `ConfigInformation....

    Qt线程安全单例模式写日志模式

    保证一个类只有一个实例,并提供一个访问它的全局访问点,使得系统中只有唯一的一个对象实例,具有线程安全,多线程测试通过。...3.写消息到日志,新的一天会重新写一个log文件 4.定向输出编译器调试信息

    自己写的关于单例学习的理解

    单例模式是软件设计模式中的一种,主要用于控制类的实例化过程,确保在整个应用程序中,一个类只有一个实例存在。在iOS开发中,单例模式被广泛应用于管理共享资源,如网络请求管理、用户偏好设置、数据存储等。下面...

    IOS单例模式Demo

    单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。在iOS开发中,单例模式被广泛应用于管理共享资源、配置设置或者在整个应用程序生命周期内需要持续存在的对象,如网络请求管理者...

    Java 单例模式 工具类

    Java中的单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供全局访问点。在Java编程中,单例模式常用于控制资源的访问,比如数据库连接池、线程池或者日志对象等。本篇文章将深入探讨如何在Java中...

    C++推箱子(单例模式)

    单例模式的应用在于,游戏中的地图状态应该是全局唯一的,即在整个游戏过程中,只有一个地图实例存在。这样可以确保所有操作都针对同一份地图进行,避免了因多个地图实例导致的数据不一致问题。实现单例模式通常有...

    单例模式(用winform写的)

    单例模式是软件设计模式中的一种,用于控制类的实例化过程,确保一个类在整个程序运行期间只有一个实例存在。在C#中,特别是在Winform应用中,单例模式经常被用来管理共享资源或者全局设置,以提高性能和避免资源...

    几种单例模式demo

    单例模式是软件设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制资源的唯一性、管理共享配置或者创建昂贵的对象时避免频繁创建销毁。 ...

    单例模式代码实现

    这个讲的是单例模式的多种不同实现方式,希望对单例感兴趣的同学看看

    单例的使用--弹出框

    使用原生JavaScript写的单例小模式,适用于大多数的form表单中。

    单例模式的简单使用

    单例模式是软件设计模式中的一种,它的核心思想是确保一个类在整个...但如果不涉及资源共享,或者需要保持对象的独立性以利于测试,那么应该避免使用单例。理解并恰当地使用单例模式,是提升iOS开发者技能的关键一步。

    C# 实现单例模式

    一个用C#写的 实现单例模式的源码程序和大家分享交流一下

    java单例模式的例子

    Java单例模式是一种常见的设计模式,它在软件工程中用于控制类的实例化过程,确保一个类只有一个实例,并提供一个全局访问点。这种模式在系统资源管理、缓存、日志记录等方面应用广泛。下面我们将深入探讨Java单例...

    Lua 单例的实现

    Lua中没有类的概念,但是程序猿说要面向对象,然后就有类。程序猿说要继承 和override,然后就有了继承 和 override 。程序猿说要有单例然后有了单例 这里用 Person 和 Student 来作为例子。有少许解释在代码中。

    java 获取 配置文件 属性 单例模式 高效加载

    通过单例模式实例化获取propertyUtil 工具包实例,高效加载配置文件,java语言编写。通过单例模式实例化获取propertyUtil 工具包实例,高效加载配置文件,java语言编写。通过单例模式实例化获取propertyUtil 工具包...

    单例模式应用场景

    ### 单例模式应用场景 #### 一、概述 在软件工程领域中,设计模式作为一种解决常见问题的方法,被广泛应用于各种编程环境中。其中,单例模式(Singleton Pattern)作为最简单的设计模式之一,旨在确保一个类只有一...

    iOS代替单例的方法

    总结,避免使用单例可以帮助我们写出更健壮、易于测试和维护的代码。通过以上提到的替代方案,我们可以更好地管理对象的生命周期,同时保持代码的灵活性和可扩展性。在实际项目中,应根据具体需求和场景选择最适合的...

    单例中要引入的头文件

    引入该文件之后,写的单例文件就不必再自己重写很多的函数,该文件中将很多函数的定义写已经写好,而且比自己写的标准,这里强烈建议。具体使用方法在该文件中有说明。

    使用python写的单例模式日志记录器(设计模式之单例模式)

    单例模式是其中之一,它确保一个类只有一个实例,并提供一个全局访问点。在这个场景中,我们讨论的是一个使用Python实现的单例模式日志记录器。日志记录器是程序中用于记录运行时信息的重要工具,它帮助开发者追踪...

    ios 单例demo

    在iOS开发中,单例(Singleton)是一种设计模式,它保证了类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如管理应用程序的全局设置、网络请求或者数据库连接等。本示例将深入探讨iOS中的...

Global site tag (gtag.js) - Google Analytics