单例模式

核心思想:构造器私有化。

饿汉式:

//饿汉式单例模式
public class Hungry {
    private Hungry(){}
    private final static Hungry hungry=new Hungry();
    public static Hungry getHungry(){
        return hungry;
    }
}
缺点:

消耗内存过高
在反射下是不安全

懒汉式(线程不安全)

public class LazMan {
    private LazMan(){}
    
    public static LazMan lazman;
    
    public static LazMan lazMan(){
        if (lazman==null){
            lazman=new LazMan();
        }
        return lazman;
    }
}
缺点:

在多线程下不安全
在反射下不安全

懒汉式(线程安全)

//懒汉式单例
public class LazMan {
    private LazMan(){}

    public volatile static LazMan lazman;

    public static LazMan lazMan(){
        if (lazman==null){
            synchronized (LazMan.class){
                if (lazman==null){
                    lazman=new LazMan();
                }
            }
        }
        return lazman;
    }
}
缺点:

在反射下不安全

内部类单例

//静态内部类单例
public class Holder {
    
    private Holder(){}
    
    public static Holder getHolder(){
        return InnerClass.holder;
    }
    
    private static class InnerClass{
        private final static Holder holder=new Holder();
    }
}
缺点:

在反射下不安全

为什么反射可以破解:

使用反射可以直接修改内部的权限
直接可以把构造器公开

解决:

使用枚举,因为反射不能破坏枚举

public enum EnumSingle {
    INSTANCE;
    public EnumSingle getInstance(){
        return INSTANCE;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在Java中,单例模式分为很多种,本人所了解的单例模式有以下几种,如有不全还请大家留言指点: 饿汉式 懒汉式/Do...
    Duang了个Duang阅读 5,335评论 0 2
  • 单例模式介绍 单例模式,是为了确保在整个软件体统中,某个类对象只有一个实例,并且该类通常会提供一个对外获取该实例的...
    本墨BM阅读 3,462评论 0 1
  • 介绍 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例, 并且该类只提...
    Qiansion齐木楠雄阅读 2,656评论 0 2
  • 前言 本文主要参考 那些年,我们一起写过的“单例模式”。 何为单例模式? 顾名思义,单例模式就是保证一个类仅有一个...
    tandeneck阅读 7,222评论 1 8
  • 单例模式 所谓单例设计模式,就是采用一定的方法,保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提...
    青聪碎月李阅读 2,507评论 0 1