java单态模式讲解

来源:互联网 发布:淘宝砖石展位 编辑:程序博客网 时间:2024/05/22 16:47

欢迎访问北大青鸟大连鑫鼎中心 www.0411bdqn.com

 

单态定义:
        Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。

        Singleton模式就为我们提供了这样实现的可能。使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection)。

使用Singleton注意事项:
        有时在某些情况下,使用Singleton并不能达到Singleton的目的,如有多个Singleton对象同时被不同的类装入器装载;在EJB这样的分布式系统中使用也要注意这种情况,因为EJB是跨服务器,跨JVM的

单态模式的演化:
        单态模式是个简单的模式,但是这个简单的模式也有很多复杂的东西。

单态模式一:
i)

public class Singleton {

  private Singleton(){}

  //在自己内部定义自己一个实例,是不是很奇怪?

  //注意这是private 只供内部调用

  private static Singleton instance = new Singleton();

  //这里提供了一个供外部访问本class的静态方法,可以直接访问 
     public static Singleton getInstance() {

  return instance;

 }

 }

ii)等同于上一种

public class Singleton {

  //注意这是private 只供内部调用

       private Singleton(){}

  private static Singleton instance;

  //这里提供了一个供外部访问本class的静态方法,可以直接访问 
     public static Singleton getInstance() {

     if (instance == null)     

              instance = new Singleton();  

          return instance;      

 }

 }

注意:这个单态模式是不安全的,为什么说呢 ?因为没考虑多线程,如下情况
        Thread 1 调用getInstance() 方法,并且判断instance是null,然後进入if模块,在实例化instance之前,Thread 2抢占了Thread 1的cpu。Thread 2 调用getInstance() 方法,并且判断instance是null,然後进入if模块,Thread 2 实例化instance 完成,返回Thread 1 再次实例化instance。这个单态已经不在是单态

单态模式二:

public class Singleton {

  private static Singleton instance = null;

  public static synchronized Singleton getInstance() {

  //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次 

  //使用时生成实例!

  if (instance==null)

  instance=new Singleton();

  return instance; }

}

注: 采用同步来解决,这种方式解决了问题,但是仔细分析正常的情况下只有第一次时候,进入对象的实例化,须要同步,其它时候都是直接返回已经实例化好的instance不须要同步,大家都知到在一个多线程的程序中,如果同步的消耗是很大的,很容易造成瓶颈 。更好的办法这里暂不研究。一般来说不涉及到多线程可优先选择第一种方式。

原创粉丝点击