java设计模式之单例模式你真的会了吗?(懒汉式篇)

一、什么是单例模式?

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

二、单例模式之懒汉式有什么特点以及优缺点?

  • 构造方法私有化
  • 在第一次被使用时构建实例,延迟初始化
  • 对外提供统一的静态工厂方法返回实例
  • 优点:需要的时候才实例化所以节约内存。
  • 缺点:第一次加载时不够快,多线程使用时不必要的同步开销大。

三、懒汉式单例的代码进阶(1)

public class LazySingleton implements Serializable {
private static final long serialVersionUID = -777413485350310911L; private LazySingleton() {} private static LazySingleton lazySingleton = null; public static LazySingleton getInstance() {
if(lazySingleton == null){
lazySingleton = new LazySingleton();
}
return lazySingleton;
}
}
  • 上面的代码存在着最明显的问题就是在多线程的环境下无法保证单例。

四、懒汉式单例的代码进阶(2)

public class LazySingleton implements Serializable {
private static final long serialVersionUID = -777413485350310911L; private LazySingleton() {} private static LazySingleton lazySingleton = null; synchronized public static LazySingleton getInstance() {
if(lazySingleton == null){
lazySingleton = new LazySingleton();
}
return lazySingleton;
}
}
  • 上面的代码在getInstance()方法前面增加了关键字synchronized进行线程锁,以处理多个线程同时访问的问题。但是,这样虽然解决了线程安全问题,但是每次调用getInstance()时都需要进行线程锁定判断,在多线程高并发访问环境中,将会导致系统性能大大降低。

五、懒汉式单例的代码进阶(3)

public class LazySingleton implements Serializable {
private static final long serialVersionUID = -777413485350310911L; private LazySingleton() {} private static LazySingleton lazySingleton = null; //double check
public static LazySingleton getInstance() {
if(lazySingleton == null){
synchronized(LazySingleton.class){
if(lazySingleton == null){
lazySingleton = new LazySingleton();
}
}
}
return lazySingleton;
}
}
  • 上面的代码采用synchronized和double check的方式成功解决了线程安全问题以及提高了多线程下的性能,但是性能任然不够理想。

六、懒汉式单例的代码进阶(4)

public class LazySingleton implements Serializable {
private static final long serialVersionUID = -777413485350310911L; private LazySingleton() {} public static LazySingleton getInstance() {
return LazyInnerSingleton.INSTANCE;
} /**
* 利用内部类的特性创建单例
*/
private static class LazyInnerSingleton {
private static final LazySingleton INSTANCE = new LazySingleton();
}
}
  • 上面利用内部类的特性创建单例既保证了线程安全(由jvm的类加载机制提供)问题又提高了性能,但是还是存在着一个问题:利用反射依然可以破坏“单例”,所以继续改进代码。

六、懒汉式单例的代码进阶(5)

public class LazySingleton implements Serializable {
private static final long serialVersionUID = -777413485350310911L; private LazySingleton() {
//防止利用反射破坏单例
if(LazyInnerSingleton.INSTANCE != null){
throw new RuntimeException("不允许构建多个实例!");
}
} public static LazySingleton getInstance() {
return LazyInnerSingleton.INSTANCE;
} /**
* 利用内部类的特性创建单例
*/
private static class LazyInnerSingleton {
private static final LazySingleton INSTANCE = new LazySingleton();
}
}
  • 在构造方法中抛出一个异常以防止通过反射破坏单例。

PS:如果你看到了这篇文章,并且觉得对你有帮助,请给个关注和点赞,谢谢!

java设计模式之单例模式你真的会了吗?(懒汉式篇)的更多相关文章

  1. java 设计模式之单例模式

    -------Success is getting what you want, happiness is wanting what you get. java设计模式之单例模式(Singleton) ...

  2. 折腾Java设计模式之单例模式

    博文原址:折腾Java设计模式之单例模式 单例模式 Ensure a class has only one instance, and provide a global point of access ...

  3. Java设计模式之单例模式(七种写法)

    Java设计模式之单例模式(七种写法) 第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作: public class Singleton { private static Singleto ...

  4. Java 设计模式之单例模式(一)

    原文地址:Java 设计模式之单例模式(一) 博客地址:http://www.extlight.com 一.背景 没有太多原由,纯粹是记录和总结自己从业以来经历和学习的点点滴滴. 本篇内容为 Java ...

  5. java设计模式1——单例模式

    java设计模式1--单例模式 1.单例模式介绍 1.1.核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 1.2.常见场景 1.3.单例模式的优点 1.4.常见的五种单例模式实现 ...

  6. java设计模式之单例模式(几种写法及比较)

    概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...

  7. java设计模式- (1)单例模式

    参加校园招聘的笔试,发现公司都会考一些java设计模式,所以上网查询相关内容,总结常用的几种单例模式. 单例模式(Singleton Pattern)是 Java中最简单的设计模式之一.这种类型的设计 ...

  8. [转]JAVA设计模式之单例模式

    原文地址:http://blog.csdn.net/jason0539/article/details/23297037 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主 ...

  9. java设计模式之单例模式(七种方法)

    单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...

随机推荐

  1. 如何在 ASP.Net Core 中实现 健康检查

    健康检查 常用于判断一个应用程序能否对 request 请求进行响应,ASP.Net Core 2.2 中引入了 健康检查 中间件用于报告应用程序的健康状态. ASP.Net Core 中的 健康检查 ...

  2. “/”应用程序中的服务器错误。||分析器错误消息: 未能加载类型“WebApplication1._Default”

    环境VS2008 无法运行WEB项目,Winfrom程序OK. 新创建的WEB项目直接运行报下图错误. 尝试多种方法: 1,重新生成项目,运行.(失败) 2,重装VS2008(默认.完全.自定义)安装 ...

  3. 050_Servlet详解

    目录 Servlet Servlet简介 HelloServlet Servlet原理 servlet-mapping Servlet请求路径 ServletContext Servlet上下文 Se ...

  4. python学习8 文件的操作

    本文拷贝了on testing 的<python之文件操作:文件的读写>,只做学习之用 python的文件读写通过 一.用open函数 二.对文件读写操作 三.读取文件位置定位 1. op ...

  5. java中if语句的应用

    1. 注释怎么写: 1.1  //单行注释 1.2  /*多行注释*/ 2. If语句的用法 2.1. if(条件语句){ (  ps:只有一行代码时可以不加{}  ) } 2.2. if(条件语句) ...

  6. 普通 Javaweb项目模板的搭建

    普通 Javaweb项目模板的搭建 1. 创建一个web项目模板的maven项目 2.配置 Tomcat 服务器 3.先测试一下该空项目 4.注入 maven 依赖 5.创建项目的包结构 6.编写基础 ...

  7. 使用 docker 进行 ElasticSearch + Kibana 集群搭建

    在Docker容器中运行Elasticsearch Kibana和Cerebro 机器信息 10.160.13.139 10.160.9.162 10.160.11.171 1. 安装docker和d ...

  8. Oracle-DG 主库将log_archive_dest_state_2远程归档线程参数设置为defer,为什么dg还是处于实时同步状态?

    一.需求,前段时间,墨天伦有个小伙伴咨询了这个问题,搞了测试环境测试下. Oracle-DG 主库将log_archive_dest_state_2远程归档线程参数设置为defer,为什么dg还是处于 ...

  9. matlab map容器类型

    matlab map容器类型 map容器类型以及map类概述 map是将一个量映射到另一个量上,此是前面的量就是map的键(key),后面的量就是map的数据(value).map的键和对应的数据都储 ...

  10. 1082 Read Number in Chinese

    Given an integer with no more than 9 digits, you are supposed to read it in the traditional Chinese ...