码迷,mamicode.com
首页 > 其他好文 > 详细

单例模式(Singleton)

时间:2015-03-04 17:12:46      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:

单例模式:确保每个类只有一个实例,并提供全局访问点来访问这个唯一实例。(Logging,driver objects)

实现:(1) 私有构造函数限制其他类的实例化

      (2) 私有静态指向自身的成员变量,类唯一的实例

      (3) 公有静态的方法,提供全局访问点来访问这个唯一实例

A.饿汉式单例:在类加载时就创建实例对象,优点无需考虑多线程同时访问的问题,缺点类加载慢,客户端不需要实用对象是也创建了实例,资源利用率不高。

public class Singleton2 {  
    /* 
     * 饿汉单例模式:在类加载的时候就创建一个单例模式. 
     */  
    // 1.私有的构造函数,确保不能在类的外部访问该类的构造函数  
    private Singleton2(){  
        System.out.println("构造函数执行了");  
    }  
      
    // 2.私有的唯一的静态实例变量,在类加载的时候就创建好单例对象  
    private final static Singleton2 instance = new Singleton2();  
      
    // 3.公开的静态工厂返回此类的唯一实例  
    public static Singleton2 getInstance(){  
        return instance;  
    }  
}

B.懒汉式单例:在第一次(调用静态工厂方法)调用时将自己实例化,实现了延迟加载,必须处理好多线程同时访问。

public class Singleton { 
    /* 
     * 单例模式:单个实例服务于整个应用 
     * 懒汉式单例:只有在第一次请求实例的时候创建,并且只在第一次创建后,以后不再创建该类的实例 
     */     
    // 1.一个私有的指向自己的静态变量  
    private static Singleton instance; 
     
    // 2.私有的构造方法,保证不能从外部创建对象  
    private Singleton(){} 
     
    // 3.公开的静态工厂方法,返回该类的唯一实例(当发现没有实例没有初始化的时候才初始化)  
    public static synchronized Singleton getInstance(){ //synchronized关键字保证线程安全性
        if(instance == null){ 
            instance = new Singleton(); 
            System.out.println("创建Singleton类的实例"); 
        }else { 
            System.out.println("实例已经创建,不能再创建"); 
        } 
        return instance; 
    }      
}

双重检查加锁机制,指的是:并不是每次进入getInstance方法都需要同步,而是先不同步,进入方法过后,先检查实例是否存在,如果不存在才进入下面的同步块,这是第一重检查。进入同步块后,再次检查实例是否存在,如果不存在,就在同步的情况下创建一个实例,这是第二重检查。这样一来,就只需要同步一次了,从而减少了
多次在同步情况下进行判断所浪费的时间。

public class Singleton{  
   private static Singleton instance = null;//是否是final的不重要,因为最多只可能实例化一次。  
   private Singleton(){}  
   public static Singleton getInstance(){  
       if(instance == null){  
           //双重检查加锁,只有在第一次实例化时,才启用同步机制,提高了性能。  
           synchronized(Singleton.Class){  
               if(instance == null){  
                   instance = new Singleton();  
               }  
           }  
       }  
       return instance;  
   }  
}


单例模式(Singleton)

标签:

原文地址:http://my.oschina.net/elain/blog/382590

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!