单例模式之饿汉、懒汉

2019-04-10  本文已影响0人  清阳_

一、单件模式用途:

单件模式属于工厂模式的特例,只是它不需要输入参数并且始终返回同一对象的引用。单件模式能够保证某一类型对象在系统中的唯一性,即某类在系统中只有一个实例。

它的用途十分广泛,打个比方,我们开发了一个简单的留言板,用户的每一次留言都要将留言信息写入到数据库中,最直观的方法是没次写入都建立一个数据库的链接。这是个简单的方法,在不考虑并发的时候这也是个不错的选择。但实际上,一个网站是并发的,并且有可能是存在大量并发操作的。如果我们对每次写入都创建一个数据库连接,那么很容易的系统会出现瓶颈,系统的精力将会很多的放在维护链接上而非直接查询操作上。这显然是不可取的。

二、下面对单件模式的懒汉式与饿汉式进行简单介绍:

1、饿汉式:在程序启动或单件模式类被加载的时候,单件模式实例就已经被创建。

2、懒汉式:当程序第一次访问单件模式实例时才进行创建。

三、饿汉模式demo:

public Simple(){

      private  static  Single s=new Single();       

      private Single(){} 

      public  static Simple getSimple(){

              return  s ; 

     }

}   


一般用于枚举法:

enum Single {

    Single;

    private Single() {}

    public  void print(){

        System.out.println("hello world");

    }

}

public  class SingleDemo {

    public  static  void main(String[] args) {

        Single a = Single.Single;

        a.print();

    }


四、懒汉模式 demo:

class Single{

  private  static  Single s =null;

  public Single() {

      if(s ==null)

        s = new   Single();

 return s;

 }

}


懒汉模式在使用时,容易引起不同步问题,所以应该创建同步"锁",demo如下:

class Single1 {

    private  static  Single1 s =null;

    public Single1() {

    }

     //同步函数的demo  public  static  synchronized  Single1 getInstance() {

        if(s ==null)

            s =new Single1();

        return s;

    }

    //同步代码快的demo加锁,安全高效publicstatic Single1 getInStanceBlock(){

        if(s==null)

            synchronized(Single1.class) {

                if(s==null)

                    s =new Single1();

            }

        return s;

    }

}

上一篇 下一篇

猜你喜欢

热点阅读