单例模式

单例模式

使用场景

1.需要频繁创建和销毁的对象

2.创建和销毁消耗资源较大的重量级对象

3.经常用到的工具对象

饿汉(静态变量形式)

优点:简单,没有多线程同步问题(类加载的时候就实例化了对象)

缺点:没有实现懒加载,可能造成内存浪费

class Singleton01{
    //构造器私有化
    private Singleton01(){}
    //本类内部创建静态对象实例
    private final static Singleton01 instance=new Singleton01();
    //提供公有的静态方法,返回实例对象
    public static Singleton01 getInstance(){
        return  instance;
    }
}

饿汉(静态代码块形式)

优点:简单,没有多线程同步问题(类加载的时候就实例化了对象)

缺点:没有实现懒加载,可能造成内存浪费

class Singleton02{
    //构造器私有化
    private Singleton02(){
    }
    private static Singleton02 instance;
    //静态代码块实例化对象
    static{
        instance=new Singleton02();
    }
    //提供公有的静态方法,返回实例对象
    public static Singleton02 getInstance(){
        return  instance;
    }

}

懒汉(线程不安全)

优点:懒加载

缺点:线程不安全,只能单线程使用

class Singleton03{
    public static Singleton03 instance;
    //构造器私有化
    private Singleton03(){
    }
    //公有方法,调用该方法时,创建实例
    public static Singleton03 getInstance(){
        if(instance==null){
            instance=new Singleton03();
        }
        return instance;
    }
}

懒汉(线程安全,对公有方法加锁)

优点:懒加载

缺点:每次调用公有方法都要受锁的影响,效率很差

class Singleton04{
    public static Singleton04 instance;
    //构造器私有化
    private Singleton04(){
    }
    //公有方法,调用该方法时,创建实例,为保证线程安全,对方法加锁
    public static synchronized Singleton04 getInstance(){
        if(instance==null){
            instance=new Singleton04();
        }
        return instance;
    }
}

懒汉式 (线程安全,双重检查)

优点:懒加载,效率高

class Singleton05{
    //volatile修改立即更新的储存
    public static volatile Singleton05 instance;
    //构造器私有化
    private Singleton05(){
    }
    //公有方法,调用该方法时,进行双重检查
    public static  Singleton05 getInstance(){
        if(instance==null){
            synchronized (Singleton05.class){
                if(instance==null){
                    instance=new Singleton05();
                }
            }
        }
        return instance;
    }
}

静态内部类方式实现单例模式

class Singleton06{

    //构造器私有化
    private Singleton06(){
    }
    //静态内部类,创建实例对象
    //外部类装载时,内部类不装载
    private static class InnerSingletonClass{
        private static final Singleton06 INSTANCE=new Singleton06();
    }
    //公有方法,调用该方法时,进行内部类的装载,只会装载一次,并且JVM在装载类时线程安全
    public static  Singleton06 getInstance(){
        return InnerSingletonClass.INSTANCE;
    }

}

枚举单例模式

java
enum Singleton07{
    INSTANCE;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值