`
lovesailing
  • 浏览: 37758 次
  • 性别: Icon_minigender_1
  • 来自: 陕西
社区版块
存档分类
最新评论

Singleton(单例模式)探索

阅读更多

 


 Singleton, 单例模式: 顾名思义,就是只有一个实例。常见的实现方法有以下几种.

 

1. 懒汉

 

  

public class Singleton{  
  
 private static Singleton instance = null;  
     
 private Singleton(){  
    
 }  
    
 public static Singleton getInstance(){  
    if(instance == null){  
       instance = new Singleton();  
    }  
    return instance;  
 }  
}  

 

这种实现方式:

 

1. 非线程安全。并发情况下,可能有多个线程进入if语句块,从而创建了多个实例。

2. 节约内存空间。只有在调用getInstance()的时候才分配对象的空间。

3. 浪费时间。每次调用都要判断instance是否为空。

4. 初始化的时候比较快,而运行时比较慢。

5. 体现了延迟加载的思想。

6. 非线程安全问题,可以通过使用synchronized关键字来处理(后面还会讨论)

 

 

 

2. 饿汉

 

  

public class Singleton{  
  
 private static final Singleton instance = new Singleton();  
     
 private Singleton(){  
    
 }  
    
 public static Singleton getInstance(){  
    
    return instance;  
 }  
}  

 

这种实现方式:

1. 线程安全的。因为类加载的时候,instance对象只被初始化了一次,利用JVM类加载机制来保证线程安全。

2. 牺牲空间。加载类的时候,无论是否使用该类,都分配了内存空间。

3. 初始化的时候稍慢,但是运行时快。

4. 体现了缓存思想。

 

 

 

 

3. 双重检查加锁机制(对比并优化懒汉方法

 

public class Singleton {
    private volatile static Singleton instance = null;

    private Singleton(){

    }

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

 

这种实现方式:

1. 线程安全。

2. 加快运行速度。只是第一次创建实例的时候同步,以后都不用同步了。

3. 比在懒汉方式中加入synchronized方法效率高:(如下)

4. volatile修饰的变量值,将不会被本地线程缓存,所有对该变量的读写都是直接操作共享内存。

5. volatile关键字屏蔽掉了JVM中的一些必要的代码优化,所以可能降低一些运行效率(没有验证)。

public static synchronized getInstance(){
     
}

 

4. 更优解决方案

 

public class Singleton {  
   
     private static class Holder {  
         private static final Singleton instance = new Singleton();  
     }  
   
     private Singleton() {  
     }  
   
     public static Singleton getInstance() {  
         return Holder.instance;  
     }  
 }  

 

 

这种实现方法:

1. 使用静态内部类和缺省同步机制实现。

2. 缺省同步机制是指:JVM隐含的执行的同步,这里指静态初始化器(在静态字段或者static{}上的初始化     器)初始化的时候。

3. 类加载的时候并不会像饿汉一样初始化对象,而是在getInstance被调用之后才会。而且JVM保证了线程安 全问题。

分享到:
评论

相关推荐

    C# 单例模式详解与线程安全性实现

    内容概要:本文详尽地阐述了 C# 中单例模式的设计思想以及其实现方式,并且特别针对单例模式的线例安全提供了多种解决方案,包括锁(lock),最终给出了一段非线程安全和一段线程安全版本的代码供参考。 适合人群:C# ...

    Delphi 深度探索(第二版)〖含随书光盘源代码〗

    6.1.2 单例模式(singleton) 6.1.3 建造模式(builder) 6.1.4 原型模式(prototype) 6.2 结构模式 6.2.1 适配器模式(adapter) 6.2.2 合成模式(composite模式) 6.2.3 装饰模式(decorator模式) ...

    设计模式相关文档和部分模式源代码

    创建型模式关注对象的创建,如单例模式(Singleton)、工厂模式(Factory Method)和抽象工厂模式(Abstract Factory),它们提供了一种创建对象的最佳方式,减少了代码之间的耦合。结构型模式处理类与类的关系,如...

    设计模式-Java语言中的应用(pdf)

    例如,EJB(Enterprise JavaBeans)中的会话bean和实体bean体现了工厂模式和单例模式,而Hibernate作为流行的ORM(Object-Relational Mapping)框架,其核心机制就是数据访问对象(DAO)模式。 总之,设计模式是...

    设计模式迷你手册chm

    1. 创建型模式:主要处理对象的创建,如单例模式(Singleton)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)。这些模式帮助我们在不指定具体...

    Python中的设计模式集合.zip

    1. **创建型模式**:这类模式主要关注对象的创建过程,如工厂模式(Factory Method)、抽象工厂模式(Abstract Factory)、单例模式(Singleton)、建造者模式(Builder)和原型模式(Prototype)。这些模式可以帮助...

    ExtJS设计模式

    - **Singleton单例模式**:确保某个类只有一个实例,并提供一个全局访问点。例如,`Ext` 和 `Ext.Ajax` 都采用了单例模式。 - **Flyweight享元模式**:用于减少创建大量相似对象所需的内存消耗。在ExtJS中,`Ext.fly...

    C#设计模式例程大全,面向对象设计模式学习新手必备,超级有用

    创建型模式关注对象的创建过程,如单例模式(Singleton)、工厂模式(Factory Method)和抽象工厂模式(Abstract Factory);结构型模式处理对象组合和结构,如适配器模式(Adapter)、装饰器模式(Decorator)和...

    Python编程 -设计模式-从入门到实践

    创建型模式主要关注对象的创建,如单例模式(Singleton)、工厂模式(Factory)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)。在Python中,我们可以利用类和元类...

    设计模式(java)

    1. 创建型模式(Creational Patterns):这类模式关注对象的创建,包括单例模式(Singleton)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)...

    Android源码设计模式解析与实战.pdf

    单例模式(Singleton) 单例模式确保一个类只有一个实例,并提供一个全局访问点。在Android开发中,经常用于管理资源或配置等场景。例如,可以使用单例模式来管理应用程序的全局状态或者控制对数据库的访问。 **...

    设计模式学习

    创建型模式如单例模式(Singleton)、工厂方法模式(Factory Method)和建造者模式(Builder)等,主要处理对象的创建;结构型模式如适配器模式(Adapter)、装饰器模式(Decorator)和代理模式(Proxy)等,关注...

    C# 设计模式案例全集合

    1. **创建型模式**:这类模式主要关注对象的创建过程,包括单例模式(Singleton)、工厂模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)。例如,单例模式...

    《设计模式》中文版

    1. 创建型模式(Creational Patterns):关注对象的创建过程,如单例模式(Singleton)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)。...

    C#设计模式(2,共2)

    创建型模式关注对象的创建,如单例模式(Singleton)、工厂方法模式(Factory Method)和建造者模式(Builder)。单例模式确保一个类只有一个实例,并提供全局访问点;工厂方法模式则将对象的创建过程延迟到子类,...

    李建忠 C#面向对象设计模式纵横谈(25):设计模式总结

    例如,在C#中,可以利用静态类实现单例模式,确保类只有一个实例;工厂方法则通过接口或抽象类定义创建对象的接口,而具体实现交给子类决定。 2. 结构型模式:这类模式关注如何组合和包装现有的类和对象,包括...

    设计模式:可复用面向对象软件的基础.zip

    1. 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。这在需要控制资源管理或者需要全局唯一对象的场景中非常有用。 2. 工厂模式(Factory):提供一个接口用于创建对象,但让子类决定实例化哪一...

    设计模式解析

    创建型模式关注对象的创建,如单例模式(Singleton)、工厂方法模式(Factory Method)和建造者模式(Builder)等,它们旨在使对象的创建过程更加灵活和可控。结构型模式处理对象组合和结构,如适配器模式(Adapter...

    介绍通用的设计模式。(基于Unity3D【C#】).zip

    一、单例模式(Singleton) 单例模式确保一个类只有一个实例,并提供一个全局访问点。在Unity3D中,常用于管理游戏对象,如GameManager或SceneManager,确保在整个游戏生命周期中只有一个实例存在。例如,单例可以...

    《设计模式:可复用面向对象软件的基础》英文版

    包括抽象工厂模式(Abstract Factory)、建造者模式(Builder)、工厂方法模式(Factory Method)、原型模式(Prototype)和单例模式(Singleton)等。 - **结构型模式**:关注于类或对象的组合方式,使它们能形成更...

Global site tag (gtag.js) - Google Analytics