单例模式总结

news2025/1/10 10:48:18

(153条消息) 解决线程安全问题&&单例模式_Master_hl的博客-CSDN博客

饿汉式

在类初始化时直接创建实例对象,不管你是否需要这个对象都会创建

直接实例化饿汉式(简洁直观)  

特点:构造器私有化、自行创建且用静态变量保存、向外提供这个实例、强调单例用final修饰

public class Singleton1{
    public static final Singleton1 INSTANCE = new Singleton1();
    private Singleton1(){

    }
}

枚举类型(最简洁)

表示该类型的对象是有限的几个,我们可以限定为一个,那么就成了单例 

public enum Singleton2{
    INSTANCE
}

静态代码块(适合复杂实例化)

single.properties文件注意放在src目录下 

info=zhangsan
public class Singleton3{
    public static final Singleton3 INSTANCE;
    private String info;
    private Singleton3(String info){
        this.info=info;
    }
    
    static{
        try{
        Properties pro=new Properties();
        pro.load(Singleton3.class.getClassLoader().getResourceAsStream("single.properties"));   
        INSTANCE=new Singleton3(pro.getProperty("info"));
        }catch(Excepetion e){
            throw new RuntimeException(e);
        }
    }
}

 注意生成getset方法和toString方法

public class TestSingleton3{
    public static void main(String[] args){
        Singleton3 s=new Singleton3.INSTANCE;
        System.out.println(s);
    }
}

懒汉式

延迟创建这个实例对象

特点:构造方法私有化、用静态变量保存这个唯一实例、提供一个静态方法获取这个实例对象

public class Singleton4{
    private static Singleton4 instance;
    private Singleton4(){}

    public static Singleton4 getInstance(){
        if(instance==null){
            try{
                thread.sleep(100);
            }catch(InterruptedException e){
                e.printStackTrace();
            }
            instance=new Singleton4();   
        }
        return instance;
    }
}
public class TestSingleton4{
    public static void main(String[] args) throws InterruptedException{
        Callable<Singleton4> c=new Callable<Singleton4>(){
            @Override
            public Singleton4 call() throws Exception{
                return Singleton4.getInstance();
            }
        };
        ExecutorService es=Executors.newFixedThreadPool(2);
        Future<Singleton4> f1=es.submit(c);
        Future<Singleton4> f2=es.submit(c);

        Singleton4 s1=f1.get();
        Singleton4 s2=f2.get();
        System.out.println(s1==s2);//false
    }
}

上面出现线程不安全问题(适合单线程),所以才会产生false

public class Singleton5{
    private static Singleton5 instance;
    private Singleton5(){}

    public static Singleton5 getInstance(){
        //第一个if提高效率问题
        if(instance==null){
            //解决线程安全问题
            Synchronized(Singleton5.class){
                if(instance==null){
                try{
                    thread.sleep(100);
                }catch(InterruptedException e){
                    e.printStackTrace();
                }
                instance=new Singleton5();   
                }
            }
        }
        return instance;
    }
}

修改了,解决了线程安全问题,并且提高了效率问题(适合多线程)

静态内部类(适合多线程)

public class Singleton6{
    private Singleton6(){}

    private static class Inner{
        private static final Singleton6 INSTANCE=new Singleton6();
    }

    public static Singleton6 getInstance(){
        return Inner.INSTANCE;
    }

说明:在内部类被加载和初始化时,才创建INSTANCE实例对象

静态内部类不会自动随着外部类的加载和初始化而初始化,它是要单独去加载和初始化的

因为是在内部类加载和初始化时,创建的,因此是线程安全的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/582636.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于改进ISODATA算法的负荷场景曲线聚类(matlab代码)

目录 1 主要内容 聚类中心选取步骤 核方法 2 部分代码 3 程序结果 4 程序链接 1 主要内容 程序复现文献《基于机器学习的短期电力负荷预测和负荷曲线聚类研究》第三章《基于改进ISODATA算法的负荷场景曲线聚类》模型&#xff0c;该方法不止适用于负荷聚类&#xff0c;同样…

六级备考19天|CET-6|翻译练习|真题·青藏铁路|9:30~11:20

目录 1 中文 2 练习 ​ 3 答案​ 4 解析 5 订正 复习 1 中文 2 练习 3 答案 4 解析 铁路 railway/railroad 全长 with a total length of 其中xxx在海拔4000多米以上&#xff0c;非限制性定语从句&#xff0c;960 kilometers of which are over 400 me…

人工智能电话客服机器人-提升效率节约人力成本

随着科技的不断发展&#xff0c;人工智能技术已经开始广泛应用于各个领域。其中&#xff0c;人工智能电话客服机器人已经成为企业提升效率、节约人力成本的重要工具。本文将从以下几个方面探讨人工智能电话客服机器人的优势和应用。 一、人工智能电话客服机器人的优势 1.24小时…

一体化校园水电管理智能系统的实际应用

摘 要&#xff1a;针对传统的校园水电管理方法管理能力低的情况&#xff0c;提出了一种基于一体化平台的校园水电管理智能管控系统设计。通过中间件设计和显示模块设计对校园的水电情况进行采集与显示&#xff0c;设定水电用量标准&#xff0c;在水电用量超出设定标准后&#x…

开始学习使用 turtlesim, ros2, and rqt

目标&#xff1a;使用turtlesim软件包和rqt工具 Background Turtlesim是一个用于学习ROS 2的轻量级模拟器。它说明了ROS 2在最基本的层面上所做的事情&#xff0c;让我们学习知道以后你将如何处理真实的机器人或机器人模拟。 ros2工具是用户如何管理、检查和与ROS系统交互的…

涨粉秘籍 | 如何快速涨粉并转化为铁粉?

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

【封装那些事】 缺失封装

缺失封装 没有将实现变化封装在抽象和层次结构中时&#xff0c;将导致这种坏味。 表现形式通常如下: 客户程序与其需要的服务变种紧密耦合&#xff0c;每当需要支持新变种或修改既有变种时&#xff0c;都将影响客户程序。每当需要在层次结构中支持新变种时&#xff0c;都添加…

港联证券投资前瞻:核电订单重回历史高位 C919圆满完成商业首航

上周五&#xff0c;沪指盘中弱势震荡下探&#xff0c;午后反弹拉升&#xff0c;科创50指数表现强势。截至收盘&#xff0c;沪指涨0.35%报3212.50点&#xff0c;深成指涨0.12%报10909.65点&#xff0c;创业板指跌0.66%报2229.27点&#xff0c;科创50指数涨1.66%&#xff1b;两市…

干货!详解playwright实现自动等待的原理

playwright在执行操作之前对元素执行一系列可操作性检查&#xff0c;以确保这些行动按预期运行。它会自动等待&#xff08;auto-wait&#xff09;所有相关检查通过&#xff0c;然后才执行请求的操作。如果所需的检查未在给定的范围内通过timeout&#xff0c;则操作将失败并显示…

vue项目中详情页向下滚动,导航选中;点击导航,详情页跳到指定区域

需求1&#xff1a;滚轮向下滚动的时候&#xff0c;导航选中 需求2&#xff1a;点击导航的时候&#xff0c;会跳转到目标区域 在生命周期中获取屏幕的高度 mounted() {//获取屏幕高度console.log(document.documentElement.clientHeight);//667}, 这里就考虑到项目优化防抖与…

2023年上半年软件设计师考试中级真题答案+解析(详细版)

目录 背景过程计算机组成原理产权保护结构化开发方法 总结 背景 2023年软考讲解 软考&#xff08;软件技术人员职业资格考试&#xff09;是中国的一项职业资格考试&#xff0c;主要针对软件行业从业人员。软考的主要目标是评估考生在软件开发、软件测试、软件项目管理等方面的…

音乐小白乐器选择,如何学一手才艺,推荐尤克里里

乐器难度说明 注意&#xff1a;这里的难度说明是音准的难度&#xff0c;就是能不能发出标准的声音 乐器按照演奏方式分类&#xff0c;分为 演奏方式乐器举例难度等级难度说明敲击木鱼&#xff0c;架子鼓&#xff0c;钢琴1敲击乐是音最准的&#xff0c;敲哪个地方就发什么音&…

MongoDB学习笔记三

目录 1.数据库增删 1.1数据库创建 1.2数据库删除 2.集合增删 2.1创建集合 2.2删除集合 3.文档增删改查 3.1查询文档 3.2创建文档 3.3删除文档 3.4更新/修改文档 1.数据库增删 1.1数据库创建 数据库创建语法格式&#xff1a; use DatabaseName 在mongodb中使用use与在m…

油猴配置教程

文章目录 目录 文章目录 前言 一. 安装油猴 二、使用步骤 三.安装插件 (ChatGPT) 四. 脚本推荐 前言 作者简介: zuiacsn 座右铭: 抱怨身处黑暗,不如提灯前行 内容介绍: 油猴 油猴&#xff08;Tampermonkey&#xff09;指的是一个流行的用户脚本管理器&#xff0c;它能使…

智能照明“暗潮涌动”

在技术持续升级、消费者观念发生转变等多方因素的共同影响下&#xff0c;与智能相关的设备销量逐渐走俏。能够为人们带来便捷、舒适的智能家居产品也逐渐走进千家万户&#xff0c;深入到人们的日常生活中。在此背景下&#xff0c;智能家居行业日渐火热&#xff0c;实现了飞速发…

SLMi331数明深力科带DESAT保护功能隔离驱动应用笔记

SLMi33X系列SLMi331数明深力科首款单通道带DESAT保护功能的IGBT/SiC隔离驱动器。内置快速去饱和(DESAT) 故障检测功能、米勒钳位功能、漏极开路故障反馈、软关断功能以及可选择的自恢复模式&#xff0c;兼容光耦隔离驱动器。 SLMi331的DESAT阈值为6.5V&#xff0c;其最大驱动电…

Facebook广告投放和海外品牌推广(KOL)哪个未来发展好一点?

在当今数字化时代&#xff0c;品牌推广和营销策略正不断演变和创新。在海外市场拓展和品牌推广方面&#xff0c;Facebook广告投放和海外品牌推广&#xff08;KOL&#xff09;已经成为两种备受关注的策略。 1.Facebook广告投放的优势&#xff1a; 广告定位精准&#xff1a;Faceb…

究诸经典,探寻大模型演变之踪迹

编者按&#xff1a;在仅仅五年的时间里&#xff0c;大语言模型、transformers几乎完全改变了自然语言处理领域。 为了便于快速、扎实、深入地学习大语言模型&#xff0c;本文整理一个简单的经典学术资料列表&#xff0c;供正在入门中的机器学习研究人员和开发者参考。 以下是译…

JAVA基础---集合

一、树结构 二叉树、二叉查找树、平衡二叉树、红黑树 1、数据结构遍历方式 1、前序遍历&#xff1a;当前节点、左子节点、右子节点 2、中序遍历&#xff1a;左子节点、当前节点、右子节点 3、后序遍历&#xff1a;左子节点、右子节点、当前节点 4、层序遍历&#xff1a;一层…

几个提高工作效率的 Python 自动化脚本,收藏!

在这个自动化时代&#xff0c;我们有很多重复无聊的工作要做。 想想这些你不再需要一次又一次地做的无聊的事情&#xff0c;让它自动化&#xff0c;让你的生活更轻松。 那么在本文中&#xff0c;我将向您介绍 10 个 Python 自动化脚本&#xff0c;以使你的工作更加自动化&#…