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

Design Model---Singleton Model

时间:2014-08-12 21:57:15      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   color   java   使用   io   

  Singleton Model是一个比较简单的模式,类图结构也很简单,不过实现却是有好几个版本。

  为什么会有单例模式?在一些共享资源上,他要求全局一致的处理结构。一些全局的资源,比如线程池,缓冲区等需要又要给类来管理这些资源,这个类实例化时候只能实例化一个,否则如果出现多个实例会出现多个对象对资源描述的不一致性。

     单例模式:In software engineering, the singleton pattern is a design pattern that restricts the instantiation of a class to one object.并提供全局访问接口。

     经典模式:

public class Singleton
{
   private static Singleton instance;
   private Singleton() //构造函数 私有
   {
   }
   public Singleton getInstance()
   {
      if(!instance)
      {
        instance = new Singleton();
      }
      return instance;
   }
}

   经典模式是简单的,但是在多线程的情况下,容易出现问题,所以又同步块的模式,双锁的模式,饥渴模式

    在getInstance加上sysnchronized可以解决同步的问题

   同步块的方法:

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

    简单地加上同步块是很容易的,但是问题也是很显然的,效率会很低,但是仔细考虑,会发现在第一次初始化的时候才会出现需要同步的问题,初始化之后就不会出现这样情况了。于是出现了双锁模式。

public class Singleton
{
   private static Singleton instance;
   private Singleton()
   {
   }
   public Singleton getInstance()
   {
      if(!instance)
      {
            synchronized(Singleton.class) { //not sychronized(instance)
               instance = new Singleton();
           }
      }
      return instance;
   }
}

首先判定instance是否为空,如果为空那么就会出现同步问题,所以使用同步块,当instance已经实例化好了,那么就不需要同步了,后面使用也不许在同步了,这种方式比较好

 还有另外一种方法,就是饥汉模式,不采用延迟初始化的方法,在声明的同时就实例化这个实力,在JVM加载这个类的时候就初始化;

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

这样也会出现一个问题,那就是当出现类被多次加载的时候就会出现这个问题。有多个实例,这违反了单例模式的规则。

 

Design Model---Singleton Model,布布扣,bubuko.com

Design Model---Singleton Model

标签:des   style   blog   http   color   java   使用   io   

原文地址:http://www.cnblogs.com/championlai/p/3908360.html

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