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

单例模式

时间:2019-08-29 17:52:13      阅读:72      评论:0      收藏:0      [点我收藏+]

标签:实例化   ==   syn   logs   lazy   情况下   加载   sync   启动   

public class Singleton {

  private Singleton(){

  }

  private static final Singleton singleton = new Singleton();

  public static Singleton getInstance(){
    return singleton;
  }
}

饿汉模式:优点(线程安全),缺点(项目启动会加载静态对象,占用内存空间)

 

public class Singleton {
    
    private Singleton(){
        
    }
    
    private volatile static Singleton singleton = null;
    
    public static Singleton getInstance(){
        if(singleton == null){
            synchronized (Singleton.class) {
                if(singleton==null){
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
        
}

懒汉模式+双重检查锁

优点:线程安全,调用getInstance之后才会实例化

缺点:使用synchronized解决了线程不安全的问题,但是也造成同时只能有一个线程调用 getInstance,效率低,而synchronized只是保证了第一次实例化不会出现线程不安全的问题。

 

 

public class Singleton {
    
    private Singleton(){
        if(Singleton.getInstance()==null){
            throw new IllegalStateException();
        }
    }
    
    public static Singleton getInstance(){
        return lazyHolder.singleton;
    }
        
    private static class lazyHolder{
        private static final Singleton singleton = new Singleton();
    }
}

静态内部类

  • 反射能否打破单例?

  首先,对外部类的私有构造器中加入 instance==null 的判断,防止反射入侵外部类。

  其次,静态内部类保证了从外部很难获取 SingletonHolder 的 Class 对象,从而保证了内部类不会被反射。

 

  • 多线程能否打破单例?

  Holder 模式借用了饿汉模式的优势,就是在加载类(内部类)的同时对 instance 对象进行初始化。

  由于自始至终类只会加载一次,所以即使在多线程的情况下,也能够保持单例的性质。

 

  • 优势?劣势?

  优势:兼顾了懒汉模式的内存优化(使用时才初始化)以及饿汉模式的安全性(不会被反射入侵)。

  劣势:需要多加载一个类;相比于懒汉模式,Holder 创建的单例,只能通过 JVM 去控制器生命周期,不能手动 destroy

参考:https://www.cnblogs.com/jing-an-feng-shao/p/7501576.html

 

单例模式

标签:实例化   ==   syn   logs   lazy   情况下   加载   sync   启动   

原文地址:https://www.cnblogs.com/linbky/p/11430883.html

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