单例模式 java 三种写法_双重锁的单例模式

单例模式 java 三种写法_双重锁的单例模式单例模式有多种写法,都有各自的优缺点,最常见的优缺点就是【懒汉和饿汉】的比较,以及是否线程安全懒汉模式,节约内存,只有使用到时才创建单例对象,可能会有线程安全问题饿汉模式,浪费内存,但可以由JVM类加载器去保证线程安全一、饿汉模式publicclassSingleton1{/***饿汉式提前创建好单例对象(在类被主动使用时便会触发静态变量的初始化)*/privatefinalstaticSingleton1INSTANCE=new

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

单例模式有多种写法,都有各自的优缺点,最常见的优缺点就是【懒汉和饿汉】的比较,以及是否线程安全

  • 懒汉模式,节约内存,只有使用到时才创建单例对象,可能会有线程安全问题
  • 饿汉模式,浪费内存,但可以由JVM类加载器去保证线程安全

一、饿汉模式

public class Singleton1 { 
   

    /** * 饿汉式提前创建好单例对象(在类被主动使用时便会触发静态变量的初始化) */
    private final static Singleton1 INSTANCE = new Singleton1();

    /** * 禁止外部实例化 */
    private Singleton1() { 
   

    }

    public static Singleton1 getInstance() { 
   
        return INSTANCE;
    }
}

二、懒汉模式(线程不安全)

public class Singleton2 { 
   

    /** * 即使是类被主动使用,也不会触发INSTANCE的创建 */
    private static volatile Singleton2 INSTANCE = null;

    /** * 禁止外部实例化 */
    private Singleton2() { 
   

    }

    /** * 当调用getInstance方法获取单例对象时再创建单例对象,当INSTANCE为空时才创建 * 这种是线程不安全的 */
    public static Singleton2 getInstance() { 
   
        if (INSTANCE == null) { 
   
            INSTANCE = new Singleton2();
        }
        return INSTANCE;
    }
}

三、懒汉模式(线程安全)

public class Singleton6 { 
   

    private static volatile Singleton6 INSTANCE = null;

    /** * 禁止外部实例化 */
    private Singleton6() { 
   

    }

    public static Singleton6 getInstance() { 
   
      	// 通过加锁保证线程安全,但是性能会相应的降低
        synchronized (Singleton6.class) { 
   
            if (INSTANCE == null) { 
   
                INSTANCE = new Singleton6();
            }
            return INSTANCE;
        }
    }

}

四、双检锁单例

public class Singleton3 { 
   

    /** * 注意这里需要用volatile去修饰,以避免指令重排代理的多线程安全问题 */
    private static volatile Singleton3 INSTANCE = null;

    /** * 禁止外部实例化 */
    private Singleton3() { 
   

    }

    public static Singleton3 getInstance() { 
   
        // 两次检查,线程安全
        if (INSTANCE == null) { 
   
            synchronized (Singleton3.class) { 
   
                if (INSTANCE == null) { 
   
                    INSTANCE = new Singleton3();
                }
            }
        }
        return INSTANCE;
    }

}

五、静态内部类写法

public class Singleton4 { 
   

    /** * 禁止外部实例化 */
    private Singleton4() { 
   

    }

    public static Singleton4 getInstance() { 
   
        // 外部内可以访问静态内部类的私有成员变量
        return Holder.instance;
    }

    /** * 静态内部类实现单例模式,只有在Holder类被主动使用时才会触发Holder类的加载,从而触发instance的实例化, * 并且是由JVM去实例化的保证线程安全,所以这种模式也是线程安全的懒汉模式 */
    static class Holder { 
   
        /** * 静态内部类里持有一个Singleton4的单例对象 */
        private static Singleton4 instance = new Singleton4();
    }
}

六、枚举写法

public enum Singleton5 { 
   

    /** * 单例对象,枚举实现单例,写法就很简单了,并且能保证线程安全(枚举类是由JVM加载),但枚举是饿汉模式 */
    INSTANCE;

    /** * 提供一个获取枚举对象的方法 */
    public Singleton5 getInstance() { 
   
        return INSTANCE;
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169700.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • idea卸载删除旧版重新安装新版后,新版本idea程序打不开闪退的解决方案

    idea卸载删除旧版重新安装新版后,新版本idea程序打不开闪退的解决方案一般情况下,都是因为激活成功教程idea时,在启动参数配置文件idea64.exe.vmoptions中添加了如下参数:-javaagent:D:\IntelliJIDEA2020.1\bin\jetbrainsCrack.jar指定了一个jar文件,而新的idea会复制该配置文件,拿来直接使用,但是如果这个jar文件不存在,那么新安装的idea就打不开。解决方案需要将idea的idea64.exe.vmoptions配置文件中上面那个参数删除掉即可,但idea64.exe.vmoptions配置

    2022年6月18日
    251
  • cmd 杀进程命令_cmd命令结束进程

    cmd 杀进程命令_cmd命令结束进程1、打开CMD,输入tasklist2、根据进程名杀进程taskkill/f/t/imGoogleCrashHandler.exe

    2022年9月5日
    2
  • 逻辑

    逻辑

    2022年1月13日
    32
  • HBase面试题总结1「建议收藏」

    HBase面试题总结1「建议收藏」hbase的特点是什么??1)hbase是一个分布式的基于列式存储的数据库,基于Hadoop的hdfs存储,zookeeper管理。2)hbase适合存储半结构化和非结构化数据,对于结构化数据字段不够确定或者杂乱无章很难按一个概念去抽取数据;3)hbase为空的纪录不会被存储;4)基于的表包含rowkey,时间戳,列族,新写入数据时,时间戳更新,同时可以查询到以前的版本;5)hbase是…

    2022年5月8日
    50
  • [数据库] 一文搞懂case when所有使用场景「建议收藏」

    [数据库] 一文搞懂case when所有使用场景「建议收藏」前几天,为了给产品分析当前用户数据结构,写sql的时候使用到了casewhen,今天来总结一下casewhen的使用方法,以此为戒,感觉写的不好请拍砖,感觉写的还可以,给哥们点个赞,或者回复一下,让我意识到我不是一个人在战斗,好了废话不多说了,进入正题。关于casewhen的使用情况,我总结下来有三种,第一、等值转换,第二、范围转换,第三、列转行操作。等值转换咱们在设计数据库的…

    2022年9月5日
    3
  • 全局平均池化层替代全连接层(battering ram)

    转载的文章链接:为什么使用全局平均池化层?关于globalaveragepoolinghttps://blog.csdn.net/qq_23304241/article/details/80292859在卷积神经网络的初期,卷积层通过池化层(一般是最大池化)后总是要一个或n个全连接层,最后在softmax分类。其特征就是全连接层的参数超多,使模型本身变得非常臃肿。之后,有大牛在NIN(NetworkinNetwork)论文中提到了使用全局平局池化层代替全连接层的思路,以下是摘录的一.

    2022年4月17日
    83

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号