单例模式 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;
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • logcat — 基本用法

    logcat — 基本用法1.Log类是一个日志类,我们可以在代码中使用logcat打印出消息常见的日志记录方法有:v(String,String)–verbose显示全部信息d(String,String)–

  • sql语句字符串用单引号还是双引号_sql什么时候用单引号

    sql语句字符串用单引号还是双引号_sql什么时候用单引号总结一下SQL语句中引号(‘)、quotedstr()、(”)、format()在SQL语句中的用法以及SQL语句中日期格式的表示(#)、(”)在Delphi中进行字符变量连接相加时单引号用(”’),又引号用(””)表示首先定义变量varAnInt:integer=123;//为了方便在此都给它们赋初值。虽然可能在引赋初值在某些情况下不对AnIntStr:string=’45…

  • PyCharm创建一个新的项目

    PyCharm创建一个新的项目欢迎使用PyCharm这是第一次使用PyCharm,如果你想学习如何使用PyCharm创建一个新的项目,可以仔细阅读这篇文章,了解一下。打开PyCharm点击创建一个新项目选择保存的目录(建议D盘),刚刚安装的默认选择新建环境,点击创建下载配置解释器Python3.8进行中开始创建以“.py”为后缀写个简单的helloworld!运行一下结果如下可以用一个子目录打包需要写的东西同样的操作这次写个learnPython,看看效果,前后对比还有文件存储

  • 京东猪脸识别比赛

    京东猪脸识别比赛最近参加京东的猪脸识别比赛,训练集是30个视频-需要数据集的朋友可以加qq:571082793

  • 各位学弟学妹,别再看教材了,时间复杂度看这篇就好了[通俗易懂]

    各位学弟学妹,别再看教材了,时间复杂度看这篇就好了[通俗易懂]时间复杂度是学习算法的基石,今天我们来聊聊为什么要引入时间复杂度,什么是时间复杂度以及如何去算一个算法的时间复杂度一、刻画算法的运行时间某日,慧能叫来了一尘打算给他补习补习一下基础知识,只见克写了一段非常简单的代码一尘看老师有点生气,开始虚心请教了为了方便讨论,这里我们把每一条语句的执行时间都看做是一样的,记为一个时间单元①蓝色框的两条语句,花费两个时间单元②黑色框的一条语句,花费n+1个时间单元③红色框的两条语句,花费2*n个时间单元这不是.

  • 错误解决

    错误解决

发表回复

您的电子邮箱地址不会被公开。

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