`
IXHONG
  • 浏览: 437603 次
  • 性别: 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之单例 - 读写配置文件。 具体可查看:https://blog.csdn.net/automoblie0/article/details/107955750

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

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

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

    自己写的关于单例学习的理解,简单易用,希望能帮到大家

    几种单例模式demo

    几种单例模式的书写方式

    单例模式--只能弹出一个窗体

    单例模式--只能弹出一个窗体 只能弹出一个窗体

    IOS单例模式Demo

    由于在项目中单例模式户经常用到,所以可以将其写成宏放头文件里,这样就可以两行代码搞定单例

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

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

    单例模式代码实现

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

    单例的使用--弹出框

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

    单例模式(用winform写的)

    单例模式小例子,大家分享啊,不好请指教!

    单例模式.ppt

    单例模式,您能写出几个呢?这个PPT将为你全面阐述5种不同形式的单例模式。

    java单例模式的例子

    java单例模式的例子java单例模式的例子java单例模式的例子

    C# 实现单例模式

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

    Lua 单例的实现

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

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

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

    单例中要引入的头文件

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

    Object-C快速生成单例的宏

    Object-C快速生成单例的宏. 秩序两行代码遍能将类变单例

    Java 单例模式 工具类

    源码 博文链接:https://tianlihu.iteye.com/blog/747737

    ios播放单例类 singleton

    一个大牛写的控制重复播放的单例类,使用的时候直接包含使用单例的方法就可以解决 多视图叠加播放的问题

    单例模式实现mdi界面子窗体控制

    昨天朋友孩子满月,去喝酒喝挂了,回家本想小睡一会又起来写代码,一不小心醒来就是今天早上了。 真是非常抱歉,为了符合原计划及帖子标题,这个帖子是补发昨天的,今天的晚一点贴上。 昨天在论坛看到有人提出MDI...

Global site tag (gtag.js) - Google Analytics