前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >单例模式

单例模式

作者头像
OPice
发布2021-09-07 17:03:01
5690
发布2021-09-07 17:03:01
举报
文章被收录于专栏:D·技术专栏D·技术专栏

介绍

  单例模式是一种对象创建的方式,特点是一个类只负责创建自己的对象,而且只保证创建一个,同时只提供一直访问方式。

实现

Demo:

代码语言:javascript
复制
public class SingletonBean {
    //由当前类创建一个Singleton的对象
    private static SingletonBean singletonBean = new SingletonBean();
    //将构造函数私有化,该类就不会实例化
    private SingletonBean(){}
    //对外提供一个获取唯一对象的方法
    public static SingletonBean getInstance(){
        return singletonBean;
    }
}
public class SingletonPattern {
    public static void main(String[] args) {
        SingletonBean instance = SingletonBean.getInstance();
    }
}

单例模式的几种实现:

1、饿汉模式

优点:没有加锁,效率高;同时利用classloader的机制避免了线程同步的问题。 缺点:类装载时就初始化,导致产生垃圾对象浪费内存。

代码语言:javascript
复制
public class SingletonBean {
    //类装载时就会初始化,所以如果该类有其他静态方法或者属性被调用,该对象就会被实例化
    private static SingletonBean singletonBean = new SingletonBean();
    private SingletonBean(){}
    //对外提供一个获取唯一对象的方法
    public static SingletonBean getInstance(){
        return singletonBean;
    }
}

2、懒汉模式

优点:无,不建议使用这种方式。 缺点:在多线程的情况下,不能保证正常工作。

代码语言:javascript
复制
public class SingletonBean {
    private static SingletonBean singletonBean;

    private SingletonBean(){}

    public static SingletonBean getInstance(){
        //再多线程的情况下,会多次实例化
        /** 比如:线程A进来判断singletonBean ==null 为true,在new SingletonBean之前线程B 进来,
        这时singletonBean ==null 还是为true的。所以会导致A、B都执行了 new SingletonBean();**/
        if (singletonBean == null){
            return new SingletonBean();
        }
        return singletonBean;
    }
}

3、懒汉安全模式

优点:第一次调用才会被创建,相比较饿汉的方式,节省空间。 缺点:每次访问获取对象时加synchronized,效率低。

代码语言:javascript
复制
public class SingletonBean {
    private static SingletonBean singletonBean;

    private SingletonBean(){}

    public static synchronized SingletonBean getInstance(){
        if (singletonBean == null){
            return new SingletonBean();
        }
        return singletonBean;
    }
}

4、双重校验模式

优点: 比较第三种懒汉安全模式来说,只是在需要实例化的时候加锁,效率上高了很多;而且需要对singletonBean 加volatile修饰符,保证对象被实例化后其他线程立即可见。

代码语言:javascript
复制
public class SingletonBean {
    private volatile static SingletonBean singletonBean;

    private SingletonBean() {
    }

    public static SingletonBean getInstance() {
        if (singletonBean == null) {
            synchronized (SingletonBean.class) {
                if (singletonBean == null) {
                    return new SingletonBean();
                }
            }
        }
        return singletonBean;
    }
}

5、静态内部类

优点:相比较恶汉模式,这种模式SingletonBean类装载并不会导致初始化,而且同样采用了classloader的机制来保证线程安全

代码语言:javascript
复制
public class SingletonBean {
    private static class SingletonBeanHolder{
        private static final SingletonBean SINGLETON_BEAN = new SingletonBean();
    }

    private SingletonBean() {
    }

    public static final SingletonBean getInstance() {
        return SingletonBeanHolder.SINGLETON_BEAN;
    }
}

6、枚举

这种方式工作中并不常用,但是这种方式确实是最简洁的。

代码语言:javascript
复制
public enum  SingletonBean {
    INSTANCE;
}

最后

建议不使用懒汉模式2、3,使用恶汉模式1,其中分情况,如果需要指定懒加载的话使用5,其他大多数情况使用4

参考:<菜鸟教程>

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 实现
    • 1、饿汉模式
      • 2、懒汉模式
        • 3、懒汉安全模式
          • 4、双重校验模式
            • 5、静态内部类
              • 6、枚举
              • 最后
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档