当前位置: 首页 > news >正文

设计模式-单例模式

文章目录

  • 单例模式
    • 饿汉式单例
    • 懒汉式单例
    • 懒汉式加锁单例
    • 双重锁校验单例
    • 静态内部类单例
    • 枚举单例

单例模式

单例模式主要是确保一个类在任何情况下只有一个实例,并提供一个全局访问的点。
主要有以下几种

饿汉式单例

/*** 饿汉式* 类加载到内存后,就实例化了一个单例,JVM保证线程安全* 简单实用,推荐使用此方式* 缺点:无论是否用到,都会在类加载的时候就完成实例化*/
public class Singleton01 {private static final Singleton01 instance = new Singleton01();private Singleton01(){}public static Singleton01 getInstance(){return instance;}public static void main(String[] args) {Singleton01 instance1 = Singleton01.getInstance();Singleton01 instance2 = Singleton01.getInstance();System.out.println(instance1 == instance2);}
}

懒汉式单例

/*** 懒汉式单例* 什么时候用,什么时候初始化实例* 虽然也可以返回单例,但是会有线程安全问题*/
public class Singleton02 {private static Singleton02 instance;private Singleton02(){}public static Singleton02 getInstance(){if (instance == null){instance = new Singleton02();}return instance;}
}

懒汉式加锁单例

/*** 懒汉式加锁单例* 这里解决了线程安全的问题,但是性能也下降了*/
public class Singleton03 {private static Singleton03 instance;private Singleton03(){}public synchronized static Singleton03 getInstance(){if (instance == null){try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}instance = new Singleton03();}return instance;}public static void main(String[] args) {for (int i = 0; i < 100; i++) {new Thread(() -> {System.out.println(Singleton03.getInstance().hashCode());}).start();}}
}

双重锁校验单例

/*** 双重锁校验* 这样可以缩小锁锁定的代码块,并且也保证了线程安全*/
public class Singleton04 {private static volatile Singleton04 instance;private Singleton04(){}public static Singleton04 getInstance(){if (instance == null){synchronized (Singleton04.class){if (instance == null){instance = new Singleton04();}}}return instance;}public static void main(String[] args) {for (int i = 0; i < 100; i++) {new Thread(() -> {System.out.println(Singleton04.getInstance().hashCode());}).start();}}
}

静态内部类单例


/*** 静态内部类方式* JVM保证了单例* 加载外部类时不会加载内部类,这样也实现了懒加载*/
public class Singleton05 {private Singleton05(){}private static class SingletonHolder{private static final Singleton05 instance = new Singleton05();}public static Singleton05 getInstance(){return SingletonHolder.instance;}public static void main(String[] args) {for (int i = 0; i < 100; i++) {new Thread(() -> {System.out.println(Singleton05.getInstance().hashCode());}).start();}}
}

枚举单例

/*** 枚举实现单例* 枚举本身就是单例的* 解决了线程安全问题,也防止反序列化*/
public enum Singleton06 {INSTANCE;public static void main(String[] args) {for (int i = 0; i < 100; i++) {new Thread(() -> {System.out.println(Singleton06.INSTANCE.hashCode());}).start();}}
}
http://www.lryc.cn/news/102712.html

相关文章:

  • golang mysql
  • uniapp使用echarts
  • Python命令模式介绍、使用
  • #typescript 使用file-saver模块#
  • 移动端适配布局rem和vw
  • 【Java基础教程】(四十八)集合体系篇 · 上:全面解析 Collection、List、Set常用子接口及集合元素迭代遍历方式~【文末送书】
  • 什么是 DNS ANAME 解析?
  • Neo4j 集群和负载均衡
  • go web框架 gin-gonic源码解读01————Engine
  • windows版docker部署springcloud项目
  • 探索工程机械远程控制新纪元:Intewell-Hyper II震撼发布!
  • DM8 DSC集群实时主备搭建
  • 配置IPv4 over IPv6隧道示例
  • 在中国区部署日志通2.0
  • centos下安装jdk
  • 【HDFS】LocatedBlocks、LocatedBlock、LocatedStripedBlock、ExtendedBlock类分析
  • Oracle 19c 报ORA-704 ORA-01555故障处理---惜分飞
  • D356周赛复盘:滑动窗口+三元问题思路
  • ETHERNET/IP 转ETHERCAT连接倍福和欧姆龙PLC的配置方法
  • Git分布式版本控制工具和GitHub(一)--简介
  • 【Terraform学习】Terraform-AWS部署快速入门(快速入门)
  • 力扣75——深度优先搜索
  • 【C++初阶】C++基础(上)——C++关键字、命名空间、C++输入输出、缺省参数、函数重载
  • 代码随想录训练营Day55动态规划part15|392.判断子序列|115.不同的子序列
  • Linux下安装RabbitMQ教程
  • 如何加强Mysql安全,请给出可行的具体措施
  • 创造自己的宠物医院预约服务小程序,步骤详解
  • MACOM EDI 需求分析
  • 使用Spring Boot AOP实现日志记录
  • 图像中不规则物体的长轴与短轴:OpenCV实现指南