java懒加载设计模式_java设计模式——单例模式

整理一下设计模式的个人理解。

描述

单例模式是java中比较常见的一种设计模式,顾名思义为一个类只能创建一个实例,多用于全局对象,如:配置的加载,spring bean加载各种配置(spring容器所有bean默认都是单例)

单例的特点为构造方法私有,因此必须内部进行实例化,并提供静态访问方法为其他对象提供该实例。即:

1、单例只能有一个实例

2、单例构造方法私有

3、单例必须自己创建唯一实例,并提供其他对象访问该实例的静态方法

优缺点

优点:由于单例模式只生成了一个实例,所以能够节约系统资源,减少性能开销,提高系统效率,同时也能够严格控制客户对它的访问。

缺点:因为系统中只有一个实例,这样就导致了单例类的职责过重,违背了“单一职责原则”,没有接口,不能继承,不方便扩展。

实现

1> 懒汉式-线程不安全

public classSingleton1 {private staticSingleton1 instance;/*** 构造方法私有*/

privateSingleton1() {

}/*** 提供静态访问实例方法

* 懒加载,其他地方用到该实例时调用该方法/创建实例,多线程时可能会创建多个实例,线程不安全

*

*@return

*/

public staticSingleton1 getInstance() {if (instance == null) {

instance= newSingleton1();

}returninstance;

}

}

上述单例在多线程下会存在线程安全问题,比较直观的解决方案是直接在方法上加同步锁,以保证只会创建一个实例

2> 懒汉式-线程安全(增加同步锁,多线程排队等待,会影响效率)

public classSingleton2 {private staticSingleton2 instance;/*** 构造方法私有*/

privateSingleton2() {

}/*** 提供静态访问实例方法

* 懒加载,其他地方用到该实例时调用该方法/创建实例,增加同步锁,保证线程安全

*

*@return

*/

public static synchronizedSingleton2 getInstance() {if (instance == null) {

instance= newSingleton2();

}returninstance;

}

}

3> 饿汉式(类加载时创建,线程安全)

类加载时即创建实例,后续直接获取该实例,好处为永远保持唯一线程安全,坏处为即使该实例永远也用不到也会创建,浪费内存资源。

备注:考虑到规范,正常如果是永远不用的实例,就应该删除,所以一般也比较推荐使用饿汉式创建单例

public classSingleton3 {//直接实例化

private static Singleton3 instance = newSingleton3();privateSingleton3() {

}/*** 直接返回已实例化的实例

*

*@return

*/

public staticSingleton3 getInstance() {returninstance;

}

}

4> 双重校验锁

instance声明为volatile线程可见,以防止重排序造成线程不安全(重排序参考:https://blog.csdn.net/ym123456677/article/details/79700623)

public classSingleton4 {//volatile 全局线程可见

private volatile staticSingleton4 instance;privateSingleton4() {

}/*** 获取实例 -- 双重校验,先判断实例是否存在,不存在对类增加同步锁,保证只创建一次

*

*@return

*/

public staticSingleton4 getInstance() {if (instance == null) {synchronized (Singleton4.class) {if (instance == null) {

instance= newSingleton4();

}

}

}returninstance;

}

}

5> 静态内部类(明确指定要实现懒加载时使用)

public classSingleton5 {private static classinner {//声明为final 不可变

private static final Singleton5 INSTANCE = newSingleton5();

}privateSingleton5() {

}/*** 获取实例 -- (懒加载)第一个线程进来时就创建实例,并赋值给final常量INSTANCE,后续任何线程调用该方法,直接获取INSTANCE

*

*@return

*/

public staticSingleton5 getInstance() {returninner.INSTANCE;

}

}

6> 枚举

枚举为单例的最佳实践

public enumSingleton6 {

RED,

GREEN,

BLACK

}

考虑到实际应用,单例一般情况下使用饿汉式,明确要求实现懒加载时使用静态内部类,不过在实际应用中,单独使用的单例都不多了,配置一般都是通过spring bean的方式配置config,枚举使用较多,对于确定的类型、状态等,直接使用枚举。

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

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

相关文章

BZOJ.4553.[HEOI2016TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)

题目链接&#xff1a;BZOJ 洛谷\(O(n^2)\)DP很好写&#xff0c;对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]d[j]1\) for(int j1; j<i; j)if(a[j]<minv[i]&&maxv[j]<a[i])//序列只会变换一次 dp[i]max{dp[j]1}; 转移要满足两个条件&#xff1a;\(a[j]…

java 快速构建ssm项目_SSM快速搭建

基本环境搭建1、 创建Maven工程2、 导入项目相关依赖的jar包springspringmvcmybatismysqljunitspring-testlombokdevtoolsxmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org…

jpa 查询 列表_终极JPA查询和技巧列表–第2部分

jpa 查询 列表这一部分是该系列文章的第一部分 。 JPA&#xff1a;NamedQuery&#xff0c;使用日期查询&#xff0c;有关getSingleResult方法的警告 为了避免重复查询代码&#xff0c;提高性能并简化维护查询&#xff0c;我们可以使用NamedQueries。 NamedQuery使用JPQL作为语…

IE针对Ajax请求结果的缓存IE浏览器同一个请求第二次是缓存数据不刷新

IE针对Ajax请求结果的缓存IE浏览器同一个请求第二次是缓存数据不刷新 IE针对Ajax请求结果的缓存/ IE浏览器同一个请求第二次是缓存 一.在AJAX请求的属性上直接设置cache function getSetServer (selectIDs) {$.ajax({url:/kl_eas/v1/monitor/servers? new Date().toTimeString…

亿联本科java_厦门亿联2018面试题

一、选择器public class EqTest {public static void main(String[] args) {EqTest e new EqTest();}public EqTest() {String s "Java";String s2 "java";//if (s.equalsIgnoreCase(s2)){System.out.println("相等");} else {System.out.pri…

如何将云持久存储添加到JBoss Cool Store

我们一直在讨论为什么应用程序开发人员在App Dev Cloud Stack系列中不能再忽略其堆栈了。 带有JBoss Cool Store的App Dev Cloud 上个月&#xff0c;我们提供了一个完整的零售示例&#xff0c;其中的JBoss Cool Store运行在您的堆栈的OpenShift Enterprise层上&#xff0c;由…

吴莫烦

https://morvanzhou.github.io/tutorials/machine-learning/ML-intro/2-1-NN/转载于:https://www.cnblogs.com/lhuser/p/8446525.html

mysql 表单属性_php表单常用属性有什么?

程序开发中&#xff0c;必不可少的会使用到form表单&#xff0c;以前只是在前端开发时简单使用&#xff0c;对它的属性不甚了解&#xff0c;最近在后端学习中&#xff0c;不断接触到它的属性,现记录一二。下面本篇文章给大家介绍php表单常用的5个属性。actionaction规定了提交表…

centos-安装python3.6环境并配置虚拟环境

python3.6下载地址&#xff1a;https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz linux下python环境配置 统一目录&#xff1a; 源码存放位置 $HOME/tools安装目录&#xff1a; /application安装python环境&#xff1a; 1. 下载 # 创建下载目录 mkdir $HOME/tools #…

java构造器详解_Java中关于构造器的使用详解

这篇文章主要介绍了Java构造器使用方法及注意事项的相关资料,这里举例说明如何使用构造器及需要注意的地方&#xff0c;需要的朋友可以参考下Java构造器使用方法及注意事项超类的构造器在子类的构造器运行之前运行&#xff0c;也就是说&#xff0c;在创建对象时&#xff0c;先运…

i219 2012驱动_2012年I / O之后

i219 2012驱动从注册到赠品&#xff0c;每年的I / O疯狂都在不断发展。 在今年20分钟内被出售&#xff0c;并没有阻止Google赠送更多的东西。 以这种速度并有望在明年发布Google Glass&#xff0c;明年注册很可能会变得更加混乱&#xff01; 因此&#xff0c;Google&#xff0c…

Mac 工程化工具

工程化工具 一、HomeBerw 安装 / 卸载 Mac系统的包管理器&#xff0c;用于安装NodeJS和一些其他必需的工具软件 1.安装 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 译注&#xff1a;在Max OS X 10.11&…

java的sql的like_[Java教程]SQL like 模糊查询, in

[Java教程]SQL like 模糊查询, in0 2018-09-14 11:00:38​[{"互联网":["网络媒体","微博","墨迹天气","河北天气","其他"]},{"气象部门":["灾害大典","灾情普查","灾情直报&q…

9.管好进程和服务

1.查看进程 1.进程分类进程一般分为交互进程、批处理进程和守护进程三类。上述三种进程各有各的作用&#xff0c;使用场合也有所不同。 交互进程&#xff1a;由一个 shell 启动的进程。交互进程既可以在前台运行&#xff0c;也可以在后台运行。 批处理进程&#xff1a;这种…

惠而浦:使用Netty和Kafka的微服务

介绍 在上一个博客中 &#xff0c;我介绍了Netty用作Web服务器。 该示例运行良好……只要需要广播服务器即可。 大多数情况下不是很有用。 更有可能的是&#xff0c;每个客户端仅接收针对其的数据&#xff0c;并保留了特殊情况下的广播&#xff0c;例如“服务器在15分钟内停机…

石化总部java面试题_中国石化面试经验

面试过程&#xff1a;首先&#xff0c;上午进行面试人员签到&#xff0c;大约100人左右。一共要2个人。下午1点半开始统一面试。人员较多&#xff0c;所以每个人只有3分钟时间&#xff0c;一共最少8位面试官。过程中&#xff0c;他们很少提问题&#xff0c;如果你的技术比较新颖…

ajax标准

$.ajax({url:"localhost:8889/server", //请求的url地址dataType:"json", //返回格式为jsonasync:true,//请求是否异步&#xff0c;默认为异步&#xff0c;这也是ajax重要特性data:{"id":"value"}, //参数值type:"GET&qu…

java 生成器 设计模式_Java中的生成器设计模式

java 生成器 设计模式Java 中的 Builder设计模式是一种创建模式&#xff0c;即用于创建对象&#xff0c;类似于 工厂方法设计模式 &#xff0c;这也是创建设计模式。 在学习任何设计模式之前&#xff0c;我建议先找出特定设计模式要解决的问题。 众所周知&#xff0c; 必要性是…

python倒排索引实现_倒排索引原理和实现 - uncle_LLD的个人空间 - OSCHINA - 中文开源技术交流社区...

关于倒排索引搜索引擎通常检索的场景是&#xff1a;给定几个关键词&#xff0c;找出包含关键词的文档。怎么快速找到包含某个关键词的文档就成为搜索的关键。这里我们借助单词——文档矩阵模型&#xff0c;通过这个模型我们可以很方便知道某篇文档包含哪些关键词&#xff0c;某…

Spring RESTful Web服务中的异常处理

1.简介 我们可能已经在Spring中遇到了几种处理RESTful Web服务应用程序中异常的方法。 在本文中&#xff0c;我们将尝试探索可以采取的最佳方法来实现有效的异常处理。 2.问题陈述 让我们创建一个简单的应用程序&#xff0c;该应用程序将在REST URI中标识员工姓名。 如果请求中…