Java设计模式之【单例模式】

何为单例

在应用的生存周期中,一个类的实例有且仅有一个

当在一些业务中需要规定某个类的实例有且仅有一个时,就可以用单例模式

比如spring容器默认初始化的实例就是单例的

单例如何实现

1、在类中定义私有的静态变量,类型为本类

2、构造器私有化

3、获取单实例的共有静态方法

代码

一、懒加载模式

  1. public class Component {
  2.  
  3. /**
  4. * 定义私有的静态变量来存放本类的单实例
  5. * 私有保证外部无法直接获取本实例
  6. * 静态保证本实例不会被回收
  7. */
  8. private static Component component;
  9.  
  10. private Component(){} //构造器私有化,保证外部无法生成本类的实例,只能在本类中创建实例
  11.  
  12. /**
  13. * 公共的静态同步方法用来获取本类的单实例
  14. * 保证线程安全(只有一个实例)
  15. * 延迟加载单实例,在第一次调用时才初始化本实例
  16. * @return
  17. */
  18. public static synchronized Component getInstance(){
  19. if(component == null)
  20. component = new Component();
  21. return component;
  22. }
  23.  
  24. }

二、积极加载模式

  1. public class Component {
  2.  
  3. private static Component component = new Component(); //在类加载的时候就初始化本实例
  4.  
  5. private Component(){} //构造器私有化保证只能在类内部创建本实例
  6.  
  7. public static Component getInstance(){
  8. return component;
  9. }
  10.  
  11. }

三、双重判断加锁模式

  1. public class Component {
  2.  
  3. private static Component component;
  4.  
  5. private Component(){}
  6.  
  7. /**
  8. * 双重判断加锁机制
  9. * @return
  10. */
  11. public static Component getInstance(){
  12. if(component == null){
  13. synchronized (Component.class){
  14. if(component == null)
  15. component = new Component();
  16. }
  17. }
  18. return component;
  19. }
  20.  
  21. }

在懒加载模式中,每次获取实例都要加锁,这会使程序运行速度变慢,通过双重判断加锁机制可以解决这个问题

方法本身不加锁,进入方法之后先判断实例是否存在,如果存在就直接返回了,这里是多线程的

如果不存在,往下走就加锁变单线程了,但是在进入同步块中还要进行一次判断

关于单例模式这篇博客讲得很好:https://www.cnblogs.com/V1haoge/p/6510196.html

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设计模式之单例模式你真的会了吗?(懒汉式篇) 一.什么是单例模式? 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供 ...

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

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

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

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

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

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

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

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

随机推荐

  1. ZKWeb网页框架1.5正式发布

    本次更新的内容有 明显的改进了IoC容器在部分情况下的性能, 当前的性能和Grace, DryIoC同等 添加IHttpResquestHandlerWrapper接口让重载Http上下文更容易 添加 ...

  2. .NET Core中使用EF Core连接MySQL

    最近一直在捣鼓.NET Core方面的东西,顺便写下点东西记录下 1.打开vs2017,新建一个项目 2.vs会自动生成一个项目,然后打开NuGet搜索MySql.Data.EntityFramewo ...

  3. UPX源码分析——加壳篇

    0x00 前言 UPX作为一个跨平台的著名开源压缩壳,随着Android的兴起,许多开发者和公司将其和其变种应用在.so库的加密防护中.虽然针对UPX及其变种的使用和脱壳都有教程可查,但是至少在中文网 ...

  4. Swift5 语言参考(三) 类型

    在Swift中,有两种类型:命名类型和复合类型.一个名为类型是当它的定义可以给出一个特定名称的类型.命名类型包括类,结构,枚举和协议.例如,名为的用户定义类的实例MyClass具有该类型MyClass ...

  5. vue项目axios请求接口,后端代理请求接口404,问题出现在哪?

    在vue项目中,列表数据需要用到qq音乐接口中的数据,但是直接请求不行,有host及referer限制,需要采用后端代理的方式.借助axios及node的express,在dev-server.js中 ...

  6. python socket 编程简单入门

    想讲讲套接字的概念 套接字,即英文socket的中文意译,起源于20世纪70年代,是加利福利亚大学的伯克利版本UNIX(称为BSD UNIX)的一部分.目的是实现主机上运行的一个程序与另一个运行的程序 ...

  7. DockPanel与GeckoFX、ChrominumFX、CefSharp结合使用问题

    在使用DockPanel与ChrominumFx时,当在以下条件下拖动窗体时,会发生ChromiumWebBrowser崩溃的情况,此种情况也会在DockPanel与GeckoFX或CefSharp结 ...

  8. spring boot + mybatis + druid + redis

    接上篇,使用redis做缓存 新建spring boot 工程,添加pom引用 <dependency> <groupId>org.springframework.boot&l ...

  9. 如何查看第三方apk的信息

    很多时候,我们需要获取别人的apk的信息.但是我们看不到apk的代码,对于apk的信息并没有直接的方法获取.那么,我们要怎么获取apk信息呢? 这里,我整理了两个方法,亲测可用. 第一种,直接使用An ...

  10. Java中函数的重载和重写

    重载 重载指的是两个或者两个以上同名函数,但它们的参数不一样,这时会出现函数重载的情况.比如下面这段代码 class Test{ public void a(){ System.out.println ...