文档章节

单例应该这么写

javahongxi
 javahongxi
发布于 2017/08/26 00:25
字数 412
阅读 9
收藏 0
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

© 著作权归作者所有

javahongxi
粉丝 168
博文 259
码字总数 779422
作品 0
朝阳
程序员
私信 提问
【单例设计模式】单例模式中为什么用枚举更好

枚举单例(Enum Singleton)是实现单例模式的一种新方式,尽管单例模式在java中已经存在很长时间了,但是枚举单例相对来说是一种比较新的概念,枚举这个特性是在Java5才出现的,这篇文章主要...

冷冷gg
2016/08/30
147
0
当单例(Singleton)爱上多线程——重复初始化问题

一、问题背景 单例,大家都应该清楚,面试时也经常被问到,大家也都会写。但就是这个最常规的东西,让我有了新的认识。 问题是这样的,我正准备做一个不同情况时的性能测试。Bean的生成方式就...

NoahX
2013/04/28
8.9K
53
Kotlin中的单例模式

在编程中,我们都应该接触到设计模式,无论是从时间总结,亦或者是从书上习得后尝试使用。这其中单例模式,是我们编程过程中很常见,也很简单的一种设计模式。我曾经写过一篇比较通用的关于该...

技术小黑屋
2017/07/17
0
0
无单测、不编码——写单元测试的重要性

作为一个开发人员。很多人很少写单元测试,甚至不写单元测试。 总结一下开发人员不写单测的原因无非有以下几种: 那么针对以上这几种观点,今天就逐个分析一下。到底单元测试有没有那么重要。...

郑加威
2017/01/18
14
0
一种Python全局配置规范以及其魔改

0x01 模块 or global 很多初学者有个误区,就是在Python中需要配置一个全局的参数时,首先想到的是global关键字,而实际上global不是干这个事的,global的功能是在将局部作用域的变量声明为全...

丁果
2017/12/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

3_数组

3_数组

行者终成事
33分钟前
7
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
今天
10
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
今天
7
0
OpenJDK之CyclicBarrier

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CyclicBarrier是Doug Lea在JDK1.5中引入的,作用就不详细描述了,主要有如下俩个方法使用: await()方法,如果当前线...

克虏伯
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部