谈到单例模式,目前最常见的代码模式不外乎两种:懒加载模式和饥饿模式。常见实现如下:
public class Singleton {
private static Singleton instance;
public static synchronized Singleton getInstance(){
if(instance ==null){
instance = new Singleton();
}
return instance;
}
}
public class Singleton {
private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
两种模式的差异只是在“空间”和“时间”之间做了选择。懒加载选择了空间换取时间,饥饿模式选择了时间换取空间。两个模式各有特点。
是代码上,懒加载模式getInstance()方法如果缺省了synchronized就是线程不安全的;而饥饿模式中静态变量是在类装载的时候被初始化一次,所以不存在线程安全问题。但是懒加载模式中使用了synchronized关键字,肯定会有访问性能上的损失。有没有更好的方式实现懒加载模式呢?目前有一种方式推荐。通过“双重加锁”的方式来实现。
public class Singleton {
private static volatile Singleton instance;
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
实现中使用了volatile关键字。被volatile修饰的变量不会本地缓存,它的读写都是直接操作的内存数据。所以不存在线程安全问题。可以看到,同步的范围只有实例没有被创建的时候才会有效,一旦实例被创建了,synchronized关键字将再也不会被用到。这根上面每次都需要做同步判断比起来,性能得到了极大的提高。
还有没有更好的实现方式,我们千万不能低估了程序员的智慧。目前就有一种这么一种叫做“public class Singleton class”的实现。它的思路是通过java内部类和缺省同步来实现。
public class Singleton {
public static Singleton getInstance() {
return SingletonHolder.instance;
}
private static class SingletonHolder{
private static volatile Singleton instance = new Singleton();
}
}
Singleton被加载的时候是不会默认初始化SingletonHolder类的,只有当我们调用getInstance()方法的时候,SingletonHolder才会进行初始化。Singleton对象才会被生成。这个实现延迟加载对象的同时,也简化了线程安全的控制,非常之巧妙!
分享到:
相关推荐
单例模式单例模式单例模式单例模式单例模式单例模式单例模式单例模式
C#单例模式C#单例模式详解C#单例模式详解C#单例模式详解
单例模式详解~~单例模式详解~~单例模式详解~~
Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式...
2020-02-10 王争设计模式之美进入课程讲述:冯永吉时长 10:21大小 8.31M上两节课中,我们针对单例模式,讲解了单例的应用场景、几种常见的代码实现
php单例模式php单例模式php单例模式php单例模式
一个简单的java工程,包含注释,一目了然,其中包含了单例模式的所有实现方式,懒汉式,饿汉式,双重校验,枚举,静态内部类等方式实现单例。
单例模式--只能弹出一个窗体 只能弹出一个窗体
单例模式和工厂模式结合应用,实现了产品的生产,适合用做课程设计,包含详细文档和代码。Java语言。喜欢的可以下载来看看那
单例模式是最简单的设计模式之一,但是对于Java的开发者来说,它却有很多缺陷。在本月的专栏中,David Geary探讨了单例模式以及在面对多线程(multithreading)、类装载器(classloaders)和序列化(serialization)时...
几种单例模式的书写方式
设计模式之七种单例模式代码及ppt,包含多线程环境测试和反序列化测试
单例模式的七种实现方法以及分析,可以作文大作业提交 1.前言 4 1.1 课题的研究背景 4 1.2 课题主要研究目标 4 2.相关技术简介 4 2.1Java简介 4 2.2IDEA简介 4 3. 单例模式的7种实现方式 5 3.1饿汉式(使用静态常量...
设计模式C++学习之单例模式(Singleton)
首先向关注过我这个系列...这立刻让我想到了最常用也是最简单最容易理解的一个设计模式 单例模式 何为 单例模式 ? 故名思议 即 让 类 永远都只能有一个实例。 由于 示例代码 比较简单 我也加了注释,这里就不在赘述
java Singleton单例模式 java Singleton单例模式
研磨单例模式研磨单例模式研磨单例模式研磨单例模式研磨单例模式研磨单例模式研磨单例模式研磨单例模式研磨单例模式
这个讲的是单例模式的多种不同实现方式,希望对单例感兴趣的同学看看
单例设计模式的优缺点 设计思想 举例表示
目录 单例模式的概念 单例模式的要点 单例模式类图 单例模式归类 单例模式的应用场景 单例模式解决的问题 单例模式的实现方式 单例模式实现方式对比 单例模式的概念 单例模式,顾名思义就是只有一个实例,并且由它...