首页 > 其他 > 详细

单例模式(Singleton)

时间:2014-03-15 13:01:31      阅读:520      评论:0      收藏:0      [点我收藏+]

  单件模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。用户程序调用时不是每次生成一个新的实例,而是都调用该类的一个唯一的实例。

  单例模式(Singleton)它拥有一个私有构造函数,这确保用户无法通过new直接实例它。除此之外,该模式中包含一个静态私有成员变量instance与静态公有方法Instance()。Instance()方法负责检验并实例化自己,然后存储在静态成员变量中,以确保只有一个实例被创建。

  实现方式一

  

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

   该方式式线程不安全的,只有在单线程下才能使用,多线程下会出现多个实例的情况,违反单例模式“唯一性”原则。

 

  实现方式二

 

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

   方式二是线程安全的,但是会影响系统效率以及占用额外的资源,因为同步在大部分情况下都不需要。

 

  实现方式三

  

1
2
3
4
5
6
7
8
public class Singleton { 
    private Singleton instance = new Singleton();
    static
    
    private Singleton (){}
    public static Singleton getInstance() { 
    return this.instance; 
    

   方式三避免了多线程的同步问题,但是,instance在类加载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用getInstance方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化instance显然没有达到lazy loading的效果。

 

  实现方式四

 

1
2
3
4
5
6
7
8
9
public class Singleton { 
     private static class SingletonHolder { 
     private static final Singleton INSTANCE = new Singleton(); 
     
     private Singleton (){}
     public static final Singleton getInstance() { 
         return SingletonHolder.INSTANCE; 
     
 

 

   该方式通过内部静态类实现instance的实例化,避免了第三种方式在类加载时就实例化的问题,只有在调用getInstance方法时才主动去实例化,实现了lazy loading的效果。

 

  实现方式五

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Singleton { 
    private volatile static Singleton singleton; 
    private Singleton (){}  
    public static Singleton getSingleton() { 
    if (singleton == null) { 
        synchronized (Singleton.class) { 
        if (singleton == null) { 
            singleton = new Singleton(); 
        
        
    
    return singleton; 
    

   经典的Double-Checked Locking方法

 

 

  

单例模式(Singleton),布布扣,bubuko.com

单例模式(Singleton)

原文:http://www.cnblogs.com/tmj-home/p/3600990.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!