Java中类的实例化是通过new关键字实现的。单例模式目标和作用,就是保证任意时刻获取到的类对象都是同一个。也就是说只能使用一次new关键字创建对象,并把这个对象一直保留下来供程序全局使用。根据不同的使用场景,有三种不同的“单例模式”实现方式,下面分别进行讲解:
单线程下的单例模式
单线程下的单例模式是最常见的使用方式,但也经常被错误的用到多线程的情况下。其实现方式很简单:
为了限制外部使用new关键字,必须把构造方法设置为私有private;
为了把这个创建的对象一直保留下来,必须使用static的常量指向这个对象;
为了外部能使用这个对象,必须暴露一个public static的方法获取这个对象。
满足这三个条件,实现代码如下:
/** * 非线程安全单例模式 * Created by gantianxing on 2017/10/17. */ public class Singleton0 { private static Singleton0 singleton0= null; private Singleton0(){ } public static Singleton0 getInstance(){ if(singleton0 == null){//多线程情况下,会创建多次 singleton0 = new Singleton0(); } return singleton0; } }
在单线程的情况下,建议使用这种方式即可。有人会问现在的程序基本都是多线程 这种方式是不是没有价值了。其实不然,程序启动初始化的过程 可以理解为单线程,比如在@PostConstruct修饰的方法中首先调用Singleton0. getInstance ()方法,保证singleton0只被初始化一次,后续多个线程调用Singleton0. getInstance ()就不存在新对象创建,其实这种场景也可以使用第二种方式:
静态初始化型单例模式
在多线程环境里,使用第一种方式,会存在多次执行singleton0 = new Singleton0();
这段代码创建对象,破坏了单例模式的定义。换句话说,上述第一种方式 如果在单线程环境下是单例模式,如果在多线程环境下就是非单例模式,不能使用。下面我们来第二种单例模式实现,这种方式是静态变量初始化实现的单例模式:
/** * 静态初始化型 线程安全单例 * Created by gantianxing on 2017/10/17. */ public class Singleton1 { private static final Singleton1 singleton1 = new Singleton1(); private Singleton1(){ } public static Singleton1 getInstance(){ return singleton1; } }
这种方式没有第一次初始化线程安全问题,程序启动时已经完成第一次初始化,后续多线程下每次取到的都是统一实例。但如果初始化时间较长,可能会影响程序启动。如果初始化时间不长,建议是用这种方式,反之采用第三种方式 进行延迟初始化。
双重检查加锁(DCL)单例模式
其实第一种方式就是延迟初始化方式,在第一次使用的时候初始化,但在多线程的情况下无法保证只初始化一次。最简单的保证同步的方式,是直接在getInstance()方法前加synchronized,但在多线程环境下有不必要的性能开销,其实只要能保证第一次new创建对象时同步即可。具体实现方式:
public class Singleton2 { //注意必须是volatile修饰,保证多线程下数据的可见性 private volatile static Singleton2 singleton2 = null; private Singleton2(){ } public static Singleton2 getInstance(){ if(singleton2 == null){//第一重检查 synchronized(Singleton2.class){//类同步 if(singleton2 == null){//第二重检查 singleton2 = new Singleton2(); } } } return singleton2; } }
双重检查加锁:第一步 第一次检查 检查singleton2是否为空;第二步 同步 如果为空执行同步代码块;第三步 第二次检查 由于有多个线程情况下有可能有多个线程等待锁,当第一个线程执行完成后,其他等待锁的线程都会依次执行,所以必须进程第二次检查,如果singleton2不为空,则不必再次创建。
另外,为了保证多线程之间数据及时可见性,必须使用 volatile修饰成员变量singleton2。
这就是经典的双重检查加锁实现,这里的使用的synchronized加锁,当然也可以使用Lock新锁api。这种实现方式可以在多线程环境下,对单例对象进行延迟实例化。
延长初始化占位类
延长初始化占位类:是对第二种方式的一种延迟初始化版本,具体是采用静态内部类的静态变量进行初始化。其原理是利用首次访问静态内部类时,只有一个线程加载该内部类,从而保证线程安全,具体实现如下:
public class Singleton4 { public class Singleton4 { private static class InnerHolder{ public static Singleton4 singleton4 = new Singleton4(); } private Singleton4(){ } public static Singleton4 getInstance(){ return InnerHolder.singleton4; } }
这种延迟初始化单例模式比第三种DCL方式更加优雅,而且性能更好。在多线程环境下,建议使用这种方式。
关于java中四种常见的单例模式实现方式,以及使用场景就总结到这里,可以根据项目具体情况灵活选择。
最后提下,单例模式不仅仅用来创建一个普通对象,同样可以用于创建单例的Map、List等。
相关推荐
基于协同过滤算法的电影推荐系统的部署与应用,将对首页,个人中心,用户管理,电影分类管理,免费电影管理,付费电影管理,电影订单管理,我的电影管理,电影论坛,系统管理等功能进行管理 项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7+ 后端技术:ssm 前端技术:Vue 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog
12345688882222
微软演示材料
1、开发环境:ssm框架;内含Mysql数据库;JSP技术 2、需要项目部署的可以私信 3、项目代码都经过严格调试,代码没有任何bug! 4、该资源包括项目的全部源码,下载可以直接使用! 5、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 6、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。
采用后端Laravel框架进行开发,前端开发框架则使用了uniapp+vue。在环境配置方面,我们建议使用php7.4 + mysql5.6 + nginx1.22 + redis,并且推荐使用宝塔面板或lnmp等工具进行配置。
1、开发环境:ssm框架;内含Mysql数据库;JSP技术 2、需要项目部署的可以私信 3、项目代码都经过严格调试,代码没有任何bug! 4、该资源包括项目的全部源码,下载可以直接使用! 5、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 6、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。
matlab
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
FlutterFire 是一组Flutter 插件 ,可让 Flutter 应用使用Firebase服务。您可以按照Firebase for Flutter代码实验室中的示例了解如何使用这些插件。 Flutter是 Google 的 UI 工具包,可用于通过单一代码库为移动设备、网页和桌面构建精美的原生编译应用。Flutter 被世界各地的开发者和组织使用,并且是免费且开源的。
小程序-祝福话(源码).zip 小程序-祝福话(源码).zip 小程序-祝福话(源码).zip
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
构建使用jQuery组件DataTables.net的Asp.Net 8 MVC应用程序的实用指南。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
c++课程设计-个人收支管理系统.7z
Centos7_shell脚本一键安装httpd_nginx_php_jdk_kafka_psql__bash-shell
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。