学而时习,稳固而之心,

好久没有复习java的知识了,今天有空温习了单例模式,这里记录一下

单例模式是常见的设计模式的一种,其特点就是 指一个类只有一个实例,且该类能自行创建这个实例  ,

保证一个类仅有一个实例,并提供一个访问它的全局访问点

看到全局我想到了staic ,昨天晚上听课学习,老师问这个是什么模式,有同学说是单例模式,都没看到static 居然说单例,想想都可怕,我也是赶紧今天补充补充

下面看看单例的几种写法

第一种 饿汉模式

//饿汉模式
public class Singletion {//创建一个静态的类并实例化private static Singletion instance = new Singletion();// 私有构造方法private Singletion() {}//获取唯一可用的对象public static Singletion getInstance() {return instance;}public void Method(){System.out.println("单例模式学习");}}

调用

public class Main {public static void main(String[] args) {//获取唯一可用的对象Singletion singletion = Singletion.getInstance();//显示singletion.Method();}}

优点:饿汉模式天生是线程安全的,使用时没有延迟。

缺点:启动时即创建实例,启动慢,有可能造成资源浪费

第二种写法:

懒汉模式(通常也叫饱汉模式)

// 懒汉模式(饱汉模式)
public class Singletion {//创建一个静态的类private static Singletion singleton = null;// 私有构造方法private Singletion() {}//获取唯一可用的对象public static Singletion getInstance() {if (singleton==null){singleton = new Singletion();}return singleton;}public void Method(){System.out.println("单例模式学习");}}

方法调用

public class Main {public static void main(String[] args) {//获取唯一可用的对象Singletion singletion = Singletion.getInstance();//显示singletion.Method();}}

优点:懒加载启动快,资源占用小,使用时才实例化,无锁。

缺点:非线程安全。

第三种写法,懒汉添加锁

懒汉模式(饱汉模式) --线程安全

// 懒汉模式(饱汉模式) )--线程安全
public class Singletion {//创建一个静态的类private static Singletion singleton = null;// 私有构造方法private Singletion() {}//获取唯一可用的对象public static synchronized Singletion getInstance() {if (singleton==null){singleton = new Singletion();}return singleton;}public void Method(){System.out.println("单例模式学习");}}

懒加载启动快,资源占用小,使用时才实例化,添加了锁

缺点:synchronized 为独占排他锁,并发性能差。即使在创建成功以后,获取实例仍然是串行化操作。

第四种写法:

懒汉模式(饱汉模式) )--双重加锁检查DCL(Double Check Lock)
// 懒汉模式(饱汉模式) )--双重加锁检查DCL(Double Check Lock)
public class Singletion {//创建一个静态的类private volatile  static Singletion singleton = null;// 私有构造方法private Singletion() {}//获取唯一可用的对象public static  Singletion getInstance() {if (singleton==null){//同步块,线程安全的创建实例synchronized (Singletion.class){//再次检查实例是否存在,如果不存在才真的创建实例if (singleton ==null){singleton=new Singletion();}}}return singleton;}public void Method(){System.out.println("单例模式学习");}}

优点:懒加载,线程安全。

注:实例必须有 volatile 关键字修饰,其保证初始化完全。

第五种写法

Holder模式

// Holder模式
public class Singletion {/*** 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例* 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载*/private static class SingletionHolder {/*** 静态初始化器,由JVM来保证线程安全*/private static Singletion instance = new Singletion();}/*** 私有化构造方法*/private Singletion() {}public static Singletion getInstance() {return SingletionHolder.instance;}public void Method() {System.out.println("单例模式学习");}}

优点:将懒加载和线程安全完美结合的一种方式(无锁)

参考连接

https://www.runoob.com/design-pattern/singleton-pattern.html

https://www.cnblogs.com/t0000/p/8250686.html

Java设计模式:单例模式相关推荐

  1. Java 设计模式 - 单例模式

    Java 设计模式 - 单例模式 作者: 霍英俊 [huo920@live.com] 文章目录 Java 设计模式 - 单例模式 单例设计模式介绍 单例设计模式八种方式 饿汉式 - 静态常量 饿汉式( ...

  2. Java设计模式——单例模式

    单例模式 1.什么是单例模式. 2.单例设计的几种实现方式. 2.1.懒汉式 2.2.饿汉式 2.3.登记式 3.总结 4.建议 1.什么是单例模式. 确保某一个类只有一个实例,并且提供一个全局访问点 ...

  3. Java设计模式——单例模式的七种写法

    单例模式(Singleton) 单例模式(Singleton)是一种常用的设计模式.在Java应用中,单例模式能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频 ...

  4. JAVA设计模式--单例模式

    Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点. 核心知识点如下: (1) 将采用单例设计模式的类的 ...

  5. 我的Java设计模式-单例模式

    就算不懂设计模式的兄弟姐妹们,想必也听说过单例模式,并且在项目中也会用上.但是,真正理解和熟悉单例模式的人有几个呢?接下来我们一起来学习设计模式中最简单的模式之一--单例模式 一.为什么叫单例模式? ...

  6. JAVA设计模式 - 单例模式

    单例模式(Singleton)是软件设计中一种比较常见的 , 相对简单的设计模式 . 1 . 单例模式的定义 所谓单例 , 指的就是单示例 , 即某个类的实现对象有且仅能有一个 , 并提供对外调用的方 ...

  7. java设计模式—单例模式

    (一)单例模式  java中一共有23种设计模式 : 是开发人员根据不同的代码场景总结出来的不同的实现方法, 归纳为23种代码的设计方法, 单例模式就是其中的一种. 单例模式 : 在整个系统中,一个类 ...

  8. 【文末抽书】Java设计模式--单例模式

    来源 :投稿 | 作者 : gyl-coder|原文:阅读原文 在介绍单例模式之前,我们先了解一下,什么是设计模式? 设计模式(Design Pattern):是一套被反复使用,多数人知晓的,经过分类 ...

  9. java设计模式---单例模式

    关于单例模式的文章,其实网上早就已经泛滥了.但一个小小的单例,里面却是有着许多的变化.网上的文章大多也是提到了其中的一个或几个点,很少有比较全面且脉络清晰的文章,于是,我便萌生了写这篇文章的念头.企图 ...

  10. JAVA设计模式-单例模式(Singleton)线程安全与效率

    一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...

最新文章

  1. android加固多渠道,Android 多渠道打包(使用友盟统计,结合360加固宝进行多渠道打包)...
  2. 如何设置多个图层层叠关系_凉山车载式叠螺污泥脱水机_山东领旗环保科技
  3. 数据库开发——MySQL——简单介绍和安装
  4. pom.xml配置文件配置jar(不用记,快速配置)
  5. 机器学习——决策树的实现
  6. 顺序表(线性表的顺序存储)---C语言版
  7. c# 字符串格式化为日期格式
  8. concurrenthashmap为什么是线程安全_为什么 StringBuilder 不是线程安全的?
  9. python深度学习介绍
  10. 阿里巴巴java开发手册心得_阿里巴巴JAVA开发手册总结
  11. LU分解法python程序代码
  12. rf2o_laser_odometry和robot_localization
  13. 如何处理计算机显卡故障,电脑显卡常见故障及解决方案
  14. ThinkPad T480 Win10系统键盘失灵
  15. 肾炎患者识别matlab,肾炎诊断 模型.doc
  16. mysql查询和更改时区
  17. MATLAB去读网页源码时中文乱码
  18. NJ 时钟自动调整功能(SNTP)
  19. Cerberus恶意软件团队解散,10万美元拍卖源代码工程
  20. 认知心理学有感(2)-感觉与知觉

热门文章

  1. Oracle根据日期区间查询Date类型的数据
  2. centos使用镜像源轻松配置golang+vscode的方法
  3. keyshot怎么批量渲染_提高Keyshot逼真渲染的小技巧
  4. 机房收费系统【VB版】——上下机
  5. Distilling the Knowledge in a Neural Network 论文笔记蒸馏
  6. 如何将自定义代码生成TVM
  7. EyeQ进展The Evolution of EyeQ
  8. Wide Deep的OneFlow网络训练
  9. MinkowskiPooling池化(上)
  10. 使用Tensorize评估硬件内部特性