设计模式(二)单例模式

单例模式:保证只有一个对象,每次获取对象获取到的都是同一个对象。
单例模式是我们程序中最常见的设计模式,很多工具类都设计成单例模式,spring中的bean也有单例,单他不是真正的单例。
单例模式总结下来有几种写法,他们共性就是私有的构造方法。

  • 懒汉式
package com.designPattern.singleton;

/**
 * 线程安全的 低效率的 懒加载
 * 直接在方法上加互斥锁 synchronized 。简单粗暴
 * 但是效率低。不加锁线程不安全,是错误代码
 */
public class SafeLazy {
    private static SafeLazy safeLazy;
    private SafeLazy(){};
    public static  synchronized  SafeLazy getInstance(){
        if(safeLazy==null){
            return new SafeLazy();
        }
        return safeLazy;
    }
  • 饿汉模式
package com.designPattern.singleton;

/**
 * 饿汉模式 由于太饿了就在初始化的时候创建对象。
 * 饿汉模式是线程安全的,但是不适合单例的大对象。
 * 或者是不常用的对象。
 */
public class Singleton {
    private static  Singleton singleton = new Singleton();
    private Singleton(){};
    public  static Singleton getInstance(){
        return singleton;
    }
}
  • (双重检查锁)线程安全的懒汉模式
package com.designPattern.singleton;

/**
 * 双重校验锁
 * 保证了线程的安全,
 * 效率比方法上互斥锁要高效,适合并发。
 * 当判断到没有实例化之后,
 * 再加锁保证线程安全判断是否仍然没有实例化
 */
public class DoubleSafeLazy {
    private static  DoubleSafeLazy safeLazy ;
    private  DoubleSafeLazy (){}
    public static DoubleSafeLazy getInstance(){
        if(safeLazy == null ){
            synchronized (DoubleSafeLazy.class){
                if(safeLazy==null){
                    safeLazy = new DoubleSafeLazy();
                }
            }
        }
        return safeLazy;
    }
}
  • 内部类的方式
package com.designPattern.singleton;

/**
 * 内部类的方式
 * 借用了外部类装载的时候,内部类不装载的特性。
 */
public class InnerSingleton {
    public static final   InnerSingleton getInstance() {
        return InnerSingletonBuilder.singleton;
    }
    private  InnerSingleton (){}
    private final  static class InnerSingletonBuilder {
        private  static InnerSingleton singleton = new InnerSingleton();
    }
}
  • 枚举的方式
    这种非常不常见,暂时不上代码。

另外有必要说一下spring的单例,spring的单例是在spring容器初始化的时候,会把bean对象创建好,放入上下文中,已一个map的形式存储, key 是bean的id,value是bean的实例对象。当每次取bean的实例的时候从map中获取,这样的单例是指的spring容器中的单例,不是真正的单例。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值