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. 懒汉模式,或可称为懒加载模式。
其实,单例还有一些深藏不漏的地方 -> 单例与序列化和反射
相关推荐
Qt之单例 - 读写配置文件。 具体可查看:https://blog.csdn.net/automoblie0/article/details/107955750
保证一个类只有一个实例,并提供一个访问它的全局访问点,使得系统中只有唯一的一个对象实例,具有线程安全,多线程测试通过。...3.写消息到日志,新的一天会重新写一个log文件 4.定向输出编译器调试信息
自己写的关于单例学习的理解,简单易用,希望能帮到大家
几种单例模式的书写方式
单例模式--只能弹出一个窗体 只能弹出一个窗体
由于在项目中单例模式户经常用到,所以可以将其写成宏放头文件里,这样就可以两行代码搞定单例
C++推箱子(单例模式)
这个讲的是单例模式的多种不同实现方式,希望对单例感兴趣的同学看看
使用原生JavaScript写的单例小模式,适用于大多数的form表单中。
单例模式小例子,大家分享啊,不好请指教!
单例模式,您能写出几个呢?这个PPT将为你全面阐述5种不同形式的单例模式。
java单例模式的例子java单例模式的例子java单例模式的例子
一个用C#写的 实现单例模式的源码程序和大家分享交流一下
Lua中没有类的概念,但是程序猿说要面向对象,然后就有类。程序猿说要继承 和override,然后就有了继承 和 override 。程序猿说要有单例然后有了单例 这里用 Person 和 Student 来作为例子。有少许解释在代码中。
通过单例模式实例化获取propertyUtil 工具包实例,高效加载配置文件,java语言编写。通过单例模式实例化获取propertyUtil 工具包实例,高效加载配置文件,java语言编写。通过单例模式实例化获取propertyUtil 工具包...
引入该文件之后,写的单例文件就不必再自己重写很多的函数,该文件中将很多函数的定义写已经写好,而且比自己写的标准,这里强烈建议。具体使用方法在该文件中有说明。
Object-C快速生成单例的宏. 秩序两行代码遍能将类变单例
源码 博文链接:https://tianlihu.iteye.com/blog/747737
一个大牛写的控制重复播放的单例类,使用的时候直接包含使用单例的方法就可以解决 多视图叠加播放的问题
昨天朋友孩子满月,去喝酒喝挂了,回家本想小睡一会又起来写代码,一不小心醒来就是今天早上了。 真是非常抱歉,为了符合原计划及帖子标题,这个帖子是补发昨天的,今天的晚一点贴上。 昨天在论坛看到有人提出MDI...