参考:http://www.jianshu.com/p/fdc64df67794
Java中的单例模式是 一种常见的设计模式,单例模式一共有好多种,这里主要讲解七种,单例模式有以下的特点:
1、单例类只能有一个实例
2、单例类必须自己创建自己的唯一实例
3、单例类必须给其他所有对象提供这一实例
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。
单例模式的好处:避免实例对象的重复创建,减少每次创建对象的时间开销,节约内存空间,避免由于操作多个实例导致的逻辑错误;
package offer.Singleton; /** * Created by Taoyongpan on 2017/10/9. * 实现单例模式 * 定义:指实现了特殊模式的类,该类仅能被实例化一次,产生唯一的一个对象 * 应用举例:windows的任务管理器,回收站,web应用的配置对象,spring中的bean默认也是单例 * 分类:饿汉式,懒汉式,双检锁,静态内部类,枚举 * 评价指标有:单例(必须),线程安全,延迟加载,防止反序列化产生新对象,防止反射攻击 * 实现方法的选择:一般情况下直接使用饿汉式就好了,要求延迟加载时倾向于用静态内部类,涉及到反序列化创建对象或反射问题最好选择枚举 */ public class Singleton { public static void main(String[] args){ Singleton1 singleton1 = Singleton1.getInstance(); Singleton2 singleton2 = Singleton2.getInstance(); Singleton3 singleton3 = Singleton3.getInstance(); Singleton4 singleton4 = Singleton4.getInstance(); Singleton5 singleton5 = Singleton5.getInstance(); Singleton6 singleton6 = Singleton6.getInstance(); Singleton7 singleton7 = Singleton7.instance; singleton7.setAttribute("Taoyongpan"); } /** * 版本一:饿汉式 * 特点:线程安全;在类初始化执行到静态属性时就分配了资源,有资源浪费问题; */ static class Singleton1{ private static final Singleton1 instance = new Singleton1(); //或者将私有静态final成员设为公有成员,可省去getInstance公有函数 private Singleton1(){} public static Singleton1 getInstance(){ return instance; } } /** * 版本二:懒汉式(非线程安全) * 特点:在第一次调用获取实例方法时分配内存,实现了懒加载;非线程安全; */ static class Singleton2{ private static Singleton2 instance = null; private Singleton2(){} public static Singleton2 getInstance(){ if (instance==null){ instance = new Singleton2(); } return instance; } } /** * 版本三:懒汉式变种(synchronized同步方法,支持多线程) * 特点:线程安全;synchronized而造成的阻塞致使效率低,而且很多的阻塞都是没必要的。 */ static class Singleton3{ private static Singleton3 instance = null; private Singleton3(){} public static synchronized Singleton3 getInstance(){ if (instance==null){ instance = new Singleton3(); } return instance; } } /** * 版本四:懒汉式变种(synchronized同步块,支持多线程) * 特点:写法不同,但与版本三有一样的问题 */ static class Singleton4{ private static Singleton4 instance = null; private Singleton4(){} public static Singleton4 getInstance(){ synchronized(Singleton4.class){ if(instance==null){ instance = new Singleton4(); } } return instance; } } //版本五:双检锁DCL,支持多线程-懒汉式 //特点:线程安全;多进行一次if判断,加入volatile修饰,优点是只有在第一次实例化时加锁,之后不会加锁,提升了效率,缺点写法复杂 //不加入volatile,可能出现第一个if判断不为null,但还并未执行构造函数的情况,因为java编译器会进行指令重排; //volatile的两大作用: //1防止编译器对被修饰变量相关代码进行指令重排;2读写操作都不会调用工作内存而是直接取主存,保证了内存可见性 //指令重排: //instance = new Singleton5()可主要分为三步:1分配内存,2调用构造函数,3instance指向被分配的内存(此时instance不为null了) //正常顺序为123,指令重排可能执行顺序为132,会造成已不为null但未执行构造函数的问题 //内存可见性: //如果字段是被volatile修饰的,Java内存模型将在写操作后插入一个写屏障指令,在读操作前插入一个读屏障指令。 //这意味着:1一旦完成写入,任何访问这个字段的线程将会得到最新的;2在写入前,任何更新过的数据值是可见的,因为内存屏障会把之前的写入值都刷新到缓存。 //因此volatile可提供一定的线程安全,但不适用于写操作依赖于当前值的情况,如自增,自减 //简单来说,volatile适合这种场景:一个变量被多个线程共享,线程直接给这个变量赋值。 //还能在双检锁上进行优化,引入一个局部变量,但个人觉得效率提成并不大,不再赘述。 //volatile参考:http://blog.csdn.net/qq_29923439/article/details/51273812 static class Singleton5{ private volatile static Singleton5 instance = null; private Singleton5(){} public static Singleton5 getInstance(){ if(instance==null){ synchronized (Singleton5.class){ if(instance==null) instance = new Singleton5(); } } return instance; } } //版本六:静态内部类,支持多线程-懒汉式 //特点:利用静态内部类(只有在出现它的引用时才被加载),完成懒加载;final保证线程安全; //类的加载顺序:http://blog.csdn.net/u012123160/article/details/53224469 //final的作用: //1. 在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 //2. 初次读一个包含final域的对象的引用,与随后读这个final域,这两个操作之间不能重排序。 //扩展:static变量初始化遵循以下规则: //1.静态变量会按照声明的顺序先依次声明并设置为该类型的默认值,但不赋值为初始化的值。 //2.声明完毕后,再按声明的顺序依次设置为初始化的值,如果没有初始化的值就跳过。 //static变量初始化参考:http://www.jb51.net/article/86629.htm static class Singleton6{ private Singleton6(){} public static Singleton6 getInstance(){ return Singleton6Holder.instance; } private static class Singleton6Holder{ public static final Singleton6 instance = new Singleton6(); } } //版本七:通过枚举实现 //一个完美的单例需要做到:单例,懒加载,线程安全,防止反序列化产生新对象,防止反射攻击 //而枚举的特性保证了以上除了懒加载以外的所有要求,而且实现代码及其简单 //Enum的单例模式参考:http://www.jianshu.com/p/83f7958b0944 enum Singleton7{ instance; private String attribute; void setAttribute(String attribute){ this.attribute = attribute; } String getAttribute(){ return this.attribute; } } }
相关推荐
YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;
项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7
weixin138社区互助养老+ssm(论文+源码)_kaic.zip
光纤到户及通信基础设施报装申请表.docx
项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7
功能完善的电商数据智能爬虫采集系统项目全套技术资料.zip
YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;
### Android程序开发初级教程(一):初识Android **平台概述** Google推出的Android操作系统平台已经正式亮相,这是一个基于Linux内核的开源操作系统。对于开发者而言,了解其架构和支持的开发语言至关重要。以下是Android平台的架构概览: **平台架构及功能** 1. **应用框架(Application Framework)**:包含可重用和可替换的组件,确保所有软件在该层面上的平等性。 2. **Dalvik虚拟机(Dalvik Virtual Machine)**:一个基于Linux的虚拟机,为Android应用提供运行环境。 3. **集成浏览器(Integrated Browser)**:基于开源WebKit引擎的浏览器,位于应用层。 4. **优化图形(Optimized Graphics)**:包括自定义的2D图形库和遵循OpenGL ES 1.0标准的3D实现。 5. **SQLite数据库**:用于数据存储。 6. **多媒体支持(Media Support)**:支持通用音频、视频以及多种图片格式(如MPEG4, H.264
内容概要:本文档是《组合数学答案-网络流传版.pdf》的内容,主要包含了排列组合的基础知识以及一些经典的组合数学题目。这些题目涵盖了从排列数计算、二项式定理的应用到容斥原理的实际应用等方面。通过对这些题目的解析,帮助读者加深对组合数学概念和技巧的理解。 适用人群:适合初学者和有一定基础的学习者。 使用场景及目标:可以在学习组合数学课程时作为练习题参考,也可以在复习考试或准备竞赛时使用,目的是提高解决组合数学问题的能力。 其他说明:文档中的题目覆盖了组合数学的基本知识点,适合逐步深入学习。每个题目都有详细的解答步骤,有助于读者掌握解题思路和方法。
.net core mvc在线考试系统asp.net考试系统源码考试管理系统 主要技术: 基于.net core mvc架构和sql server数据库,数据库访问采用EF core code first,前端采用vue.js和bootstrap。 功能模块: 系统包括前台和后台两个部分,分三种角色登录。 管理员登录后台,拥有科目管理,题库管理,考试管理,成绩管理,用户管理等功能。 教师登录后台,可进行题库管理,考试管理和成绩管理。 用户登录前台,可查看考试列表,参加考试,查看已考试的结果,修改密码等。 系统实现了国际化,支持中英两种语言。 源码打包: 包含全套源码,数据库文件,需求分析和代码说明文档。 运行环境: 运行需vs2019或者以上版本,sql server2012或者以上版本。
YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;
包含了登陆注册、用户管理、部门管理、文件管理、权限管理、日志管理、个人中心、数据字典和代码生成这九个功能模块 系统采用了基于角色的访问控制,角色和菜单关联,一个角色可以配置多个菜单权限;然后再将用户和角色关联,一位用户可以赋予多个角色。这样用户就可以根据角色拿到该有的菜单权限,更方便管理者进行权限管控。 本系统还封装了文件管理功能,在其他模块如若要实现图片/文件上传预览时,前端只需导入现成的 Vue 组件即可实现(使用 viewerjs 依赖实现),后端只需定义 String 类型的实体类变量即可,无需再去研究文件上传预览的相关功能,简化了开发者的工作量。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
三相10Kw光伏并网逆变器。包含全套理图 PCB 源代码
GJB 5236-2004 军用软件质量度量文档,本称准规定了车用软件产品的质重模型和基本的度量。本标准为确定车用软件质量需求和衡量军用 软件产品的能力提供了一个框架。
基于MATLAB车牌识别系统【GUI含界面】.zip。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
【宿舍管理系统】是一种专为高校或住宿机构设计的信息化解决方案,旨在提高宿舍管理的效率和准确性。该系统包含了多项核心功能,如宿舍管理员管理、宿舍信息维护、查询、卫生检查以及电费缴纳等,旨在实现全面的宿舍运营自动化。 **宿舍管理员管理**功能允许指定的管理员进行用户权限分配和角色设定。这包括对管理员账户的创建、修改和删除,以及设置不同的操作权限,例如只读、编辑或管理员权限。通过这样的权限控制,可以确保数据的安全性和管理的规范性。 **宿舍添加与管理**是系统的基础模块。管理员可以录入宿舍的基本信息,如宿舍号、楼栋、楼层、房间类型(单人间、双人间等)、容纳人数、设施配置等。此外,系统还支持批量导入或导出宿舍信息,方便数据的备份和迁移。 **查询功能**是系统的重要组成部分,它允许管理员和学生根据不同的条件(如宿舍号、楼栋、学生姓名等)快速查找宿舍信息。此外,系统还可以生成各种统计报告,如宿舍占用率、空闲宿舍数量等,以便于决策者进行资源优化。 **卫生检查**功能则是对宿舍卫生状况进行定期评估。管理员可设定检查计划,包括检查周期、评分标准等,并记录每次检查的结果。系统能自动生成卫生报表,用于
YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;
九缸星形发动机点火器3D
本项目可以作为小程序毕设项目,主要功能为音乐播放器,主要功能是:可以播放歌曲(采用mp3网络连接实现)、专辑封面播放时可以旋转,能够实现开始和暂停播放,可以点击下一首歌曲,主页面实现动态轮播图
出差审批单(表格模板).docx