单例模式

 

什么是单例模式

  单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。

 

单例模式的设计思路:

  1.将构造函数私有化,保证类外部不能使用new关键字自行创建对象

  2.在类内部实例化一个对象并通过 静态方法返回

 

单例模式的实现方式:

  1.饿汉式单例模式

 

 

class Singleton{
  
    private Singleton(){            
    System.out.println("单例模式");
    }
    private static  Singlleton single=new Singlleton();
    Public static  Singleton  getInstance(){
      return singleton;
  }   
    
}

 

缺点:在一加载的时候就实例化,提前占用系统资源

优点:线程安全

 

  2.懒汉式单例模式  synchronized

 

 

class  Singleton{
    private static Singleton  single=null;
    public static synchronized Singleton getInstance(){
    if(singleton==null){    //只在null的时候实例化
        singleton=new Singleton();
    }
    return singleton;
  }
}    

 

优点:解决了饿汉模式一加载就占用资源的问题

缺点:线程不安全。每次都需要锁住方法,只允许一个线程访问,效率低下

synchronized:将一个方法或代码块锁住,同一时间只允许一个代码访问

 

 

 

  3.双重加锁的懒汉模式

 

class Singleton{
    private static Singleton=null;
    public static synchronized   Singleton getInstance(){
    if(singleton==null){
        synchronized(Singleton.class){//锁住那个类的对象
            if(singleton==null){
                singleton=new Singleton(); 
            }
        }
    }
    return singleton;
  }
}    

 

 

 

只有当第一次singleton为null的时候,才进行线程锁

当后续singleton不为null时,可以允许多个线程同时拿走singleton

 

 

  4.静态内部类实现单例

 

private static class Singleton1{
    private static Singleton singleton=new Singleton();
}
public static Singleton getInstance(){
    return Singleton1.singleton;
}

 

解决了饿汉式提前占用资源的问题,解决了懒汉式线程不安全的问题

 

posted @ 2018-04-22 21:42  长亭一抹斜阳  阅读(123)  评论(0编辑  收藏  举报