设计模式

单例模式:

懒汉式:  单例还是静态内部类式最优:

优点:利用了classloader机制来保证初始化instance时只有一个线程,线程安全且没有性能损耗
      主类实例化之后,内部类才能开始实例化,所以调用的时候才会去创建对象;因为是static final和直接new的,所以不用考虑多线程的问题!
public class Singleton {
    private Singleton() {}

    //内部类的初始化需要依赖主类,需要先等主类实例化之后,内部类才能开始实例化
    private static class LazyHolder {
        //这里加final是为了防止内部将这个属性覆盖掉
        private static final Singleton INSTANCE = new Singleton();
    }

    //这里加final是为了防止子类重写父类
    public static final Singleton getInstance() {
        return LazyHolder.INSTANCE;
    }
}

 

懒汉式:    单例推荐使用懒汉式双重校验(既避免资源的浪费,又避免多线程的问题!)
           synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住
           volatile保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的
           
           //缺点:双重锁降低了程序响应速度和性能
public class Singleton {
    private static volatile Singleton singleton;
    private Singleton() {}
    public static Singleton getInstance() {
     //进来发现不为空,直接返回,无需等待
        if (singleton == null) {
         //为空,排队执行
            synchronized (Singleton.class) {
            //后面进来判断是否已经创建对象,已经创建直接返回
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

 


饿汉式: 上来就new不用考虑多线程,缺点可能会造成资源的浪费!
public class Singleton {
    private  static Singleton INSTANCE = new Singleton();
    private Singleton(){}
    public static Singleton getInstance(){
        return INSTANCE;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值