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

  • 相关阅读:
    php多态
    ssl certificate problem: self signed certificate in certificate chain
    test plugin
    open specific port on ubuntu
    junit vs testng
    jersey rest service
    toast master
    use curl to test java webservice
    update folder access
    elk
  • 原文地址:https://www.cnblogs.com/zhxiang/p/2312445.html
Copyright © 2011-2022 走看看