请选择 进入手机版 | 继续访问电脑版

单例模式

[复制链接]
奇奇女 发表于 2020-12-31 20:24:44 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
单例模式:顾名思义就是对象的实例只有一个
实现单例模式的方式有多种方式
1、饿汉式
  1. // 饿汉式单例public class Singleton1 {    // 私有构造    private Singleton1() {}    private static Singleton1 single = new Singleton1();    // 静态工厂方法    public static Singleton1 getInstance() {        return single;    }}
复制代码
饿汉式是在类加载初始化的时候就已经吧对象创建好了,提供了一个静态的工厂方法供使用者调用,除非系统重启否则对象不会消失,自己也是线程安全的。但是有一个缺点就是不管背面用不消这个对象都会被创建。
2、.懒汉式
  1. // 懒汉式单例public class Singleton2 {    // 私有构造    private Singleton2() {}    private static Singleton2 single = null;    public static Singleton2 getInstance() {        if(single == null){            single = new Singleton2();        }        return single;    }}
复制代码
实现了使用时才华创建单例对象,但是存在现在安全问题,多线程时会实例化多个对象,不能包管单例,一般都会用synchronizeds与valatile来包管其线程安全
  1. public class Singleton3 {    // 私有构造    private Singleton3() {}    private volatile static Singleton3 single = null;    // 双重查抄    public static Singleton3 getInstance() {        if (single == null) {            synchronized (Singleton3.class) {                if (single == null) {                    single = new Singleton3();                }            }        }        return single;    }}
复制代码
关于valatile的作用有禁止指令重排序、内存可见性。百度一下二者作用再联合下面的话就能知道
多个线程同时对single访问时虽然有synchronized关键字但是当第一个线程创建对象后,jvm会给数据分配内存,在此过程中可能第二个线程已经进来,此时对于第二个线程来说single依旧是null,依旧会再去创建。valatile关键字会包管多线程场景下一个线程对数据改变,其他线程立即可见。所以要加valatile关键字
除了上面二种常用的,下面也有几种可以实现
3、静态内部类
  1. public class Singleton3 {   // 私有构造   private Singleton3() {}   // 静态内部类   private static class InnerObject{       private static Singleton3 single = new Singleton3();   }      public static Singleton3 getInstance() {       return InnerObject.single;   }}
复制代码
4、静态代码块
  1. public class Singleton4 {        // 私有构造    private Singleton4() {}        private static Singleton4 single = null;    // 静态代码块    static{        single = new Singleton4();    }        public static Singleton4 getInstance() {        return single;    }}
复制代码
别的在spring中也有不少地方用到单例模式,spring的依赖注入,AOP的切点定义中等。

来源:https://blog.csdn.net/woxingyixu/article/details/111885295
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )