zoukankan      html  css  js  c++  java
  • 单例模式

             单例模式确保类只有一个实例,并提供一个全局访问点。单例模式平时使用的机会不多,通常用于数据库连接或线程池。

    全局变量和单例模式比较

           在java中,全局变量基本上是对对象的静态引用,可以提供全局访问。但有两个缺点:①不能确保只有一个实例,他会用许多全局变量指向许多小对象来污染命名空间;②急切实例化,在程序开始就创建好对象

           单例模式:① 确保类只有一个实例 ;②单件可以延迟实例化。利用单件模式可以在需要是创建对象。③没有公开的构造器,他的构造器通常声明为私有的。④单例类保持了一个对唯一的单例实例的静态引用,并且会从静态getInstance()方法中返回对那个实例的引用。

    jw-0425-designpatterns1 

     

    经典的单例模式实现

       1: public class Singleton {   
       2:    private static Singleton uniqueInstance;   
       3:     
       4:    protected Singleton() {    }   
       5:    public static Singleton getInstance() {   
       6:       if(uniqueInstance == null) {   
       7:          uniqueInstance = new Singleton();   
       8:       }   
       9:       return uniqueInstance;   
      10:    }   
      11: }   

     

    处理多线程

    每个类加载器都定义了一个命名空间,如果不同类加载器加载同一个类(单例),可以回出现多个单例共存的情况。(当然也可以自行指定类加载器,并指定同一个类加载器)。

      在上述代码中,如果一个线程在第二行的赋值语句发生之前切换,那么成员变量instance仍然是null,然后另一个线程可能接下来进入到if块中。在这种情况下,两个不同的单例类实例就被创建。

    只有把getInstance()变成同步(synchronized)方法,多线程灾难几乎就可以轻易解决了。

       1: public class Singleton {   
       2:    private static Singleton uniqueInstance;   
       3:     
       4:    protected Singleton() {    }   
       5:    public static synchronized Singleton getInstance() {   
       6:       if(uniqueInstance == null) {   
       7:          uniqueInstance = new Singleton();   
       8:       }   
       9:       return uniqueInstance;   
      10:    }   
      11: }   

    但是,如果只有第一次执行此方法时才需要同步,之后每次调用同步这个方法就显得比较累赘。

    解决方法:

    一。如果getInstance()的性能对于应用程序不是很关键,就什么也别做。

    二。使用“急切”创建实例,而不使用延迟实例化的做法。

       1: public class Singleton {   
       2:    private static Singleton uniqueInstance=new Singleton();   
       3:    protected Singleton() {    }   
       4:    public static synchronized Singleton getInstance() {   
       5:       return uniqueInstance;   
       6:    }   
       7: }   

    三。用“双重检测加锁”,在getInstance()中减少使用同步。首先检测是否实例已经创建,如果尚未创建,才进行同步,这样就只有第一次会同步。这可以大大减少getInstance()的时间耗费,性能得到提高。。

       1: public class Singleton {   
       2:    private volatile static Singleton uniqueInstance;     
       3:    protected ClassicSingleton() {  }   
       4:    public static Singleton getInstance() {
       5:      synchronized(Singleton.class){
       6:       if(uniqueInstance == null) {   
       7:          uniqueInstance = new Singleton();   
       8:       } }  
       9:       return instance;   
      10:    }  
      11: }   

    网上看到一个讲单例模式的好帖:http://www.iteye.com/topic/60179

  • 相关阅读:
    python 自定义异常
    requests
    python 三目运算
    concurrent.futures
    iteratable iterator generator 初步理解总结
    python2 与 python3 的编码
    协程上下文与Job深入解析
    gradle快速入门、groovy环境搭建
    Kotlin项目实战之手机影音---基类抽取、欢迎界面、抽取startactivityandfinish、主界面布局
    Kotlin项目实战之手机影音---项目介绍、项目启动
  • 原文地址:https://www.cnblogs.com/zhxiang/p/2312445.html
Copyright © 2011-2022 走看看