【单例模式】饿汉式,懒汉式?JAVA如何实现单例?线程安全吗?

在这里插入图片描述

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~
个人主页:.29.的博客
学习社区:进去逛一逛~

在这里插入图片描述

单例设计模式

  • Java单例设计模式


Java单例设计模式

  • 单例设计模式(Singleton):单例即唯一实例,某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式。(例如:代表JVM运行环境的Runtime类)

要点

  • ①某个类只能有一个实例。
    • 构造器私有化。
  • ②这个类必须自行创建这个实例。
    • 含有一个该类的静态变量来保存这个唯一的实例。
  • ③这个类必须自行向整个系统提供这个实例。
    • 对外提供获取该实例的方式:
        1. 直接暴露
        2. 用静态变量的get方法获取

饿汉式

  • 饿汉式:直接创建对象,不存在线程安全问题。(在类初始化时直接创建对象,不管你是否需要这个对象都会创建)
  • 实现方式:
    • 直接实例化饿汉式(简洁明了)
    • 枚举式(最简洁)
    • 静态代码块饿汉式(适合复杂实例化)

  1. 直接实例化
//Singleton:单例设计模式,软件开发中常见的设计模式之一//单例设计模式——饿汉式1:直接实例化饿汉式
/** 1.构造器私有化* 2.自行创建,并且用静态变量保存* 3.向外提供这个实例* 4.使用final修饰,强调这是一个单例*/
public class Singleton_hungry1 {//直接实例化private static final Singleton_hungry1 INSTANCE = new Singleton_hungry1();//构造器私有化private Singleton_hungry1(){}}

  1. 枚举式
/*** 枚举类型:表示该类型的变量是有限的几个* 我们可以限定为一个,从而成了单例**/
public enum Singleton_hungry2 {//枚举类型的实例INSTANCE;private Singleton_hungry2() {}
}

  1. 静态代码块
public class Singleton_hungry3 {public static final Singleton_hungry3 INSTANCE;static {//复杂情况在静态代码块中解决INSTANCE = new Singleton_hungry3();}private Singleton_hungry3() {}
}

懒汉式

  • 懒汉式:延迟创建对象。
  • 实现方式:
  • 线程不安全(适用于单线程)
  • 线程安全(适用于多线程)
  • 静态内部类形式(适用于多线程)
  1. 线程不安全
/** 懒汉式:延迟创建这个实例对象* 1. 构造器私有化* 2.用一个静态变量保存唯一实例* 3.提供一个静态方法,用于获取实例*/
public class Singleton4 {private static Singleton4 instance;private Singleton4() {}//线程不安全public static Singleton4 getInstance() {if(instance == null) {instance = new Singleton4();}return instance;}}

  1. 线程安全
public class Singleton5 {private static Singleton5 instance;private Singleton5() {}public static Singleton5 getInstance() {//上锁、线程安全synchronized(Singleton5.class){if(instance == null) {instance = new Singleton5();}}return instance;}}

  1. 静态内部类形式
/** 懒汉式:延迟创建这个实例对象* 1. 构造器私有化* 2.用一个静态变量保存唯一实例* 3.提供一个静态方法,用于获取实例*/
public class Singleton6 {private Singleton6() {}//内部类:静态内部类不会随着外部类的加载和初始化而初始化,它是要单独去加载和初始化的//唯一实例因为是在内部类加载和初始化时才创建的,所以线程安全private static class inner{//唯一实例: 在内部类被加载和初始化时才被创建private static Singleton6 instance = new Singleton6();}public static Singleton6 getInstance() {return inner.instance;}}



在这里插入图片描述

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

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

相关文章

数组与链表算法-矩阵算法

目录 数组与链表算法-矩阵算法 矩阵相加 C代码 矩阵相乘 C代码 转置矩阵 C代码 稀疏矩阵 C代码 数组与链表算法-矩阵算法 矩阵相加 矩阵的相加运算较为简单,前提是相加的两个矩阵对应的行数与列数必须相等,而相加后矩阵的行数与列数也是相同的。…

Hadoop分布式安装

首先准备好三台服务器或者虚拟机,我本机安装了三个虚拟机,安装虚拟机的步骤参考我之前的一篇 virtualBox虚拟机安装多个主机访问虚拟机虚拟机访问外网配置-CSDN博客 jdk安装 参考文档:Linux 环境下安装JDK1.8并配置环境变量_linux安装jdk1.8并…

城市群(Megalopolis)/城际(inter-city)OD相关研究即Open Access数据集调研

文章目录 1 城市群/城际OD定义2 理论模型与分析方法2.1 重力模型 Gravity Model2.2 干预机会模型 Intervening Opportunities Model2.3 辐射模型 Radiation Model 3 Issues related to OD flows3.1 OD Prediction3.2 OD Forecasting3.3 OD Construction3.4 OD Estimation 4 OD …

C/C++数据结构之深入了解树与二叉树:概念、存储结构和遍历

树是一种常见的数据结构,它在计算机科学和数学中都有广泛的应用。树结构的最简单形式是二叉树,本文将深入探讨树和二叉树的概念、存储结构以及二叉树的遍历,并提供一些实际的代码示例来帮助理解这些概念。 树与二叉树的概念 树 (Tree) 树是…

雷电_安卓模拟器安装burpsuit_CA证书

雷电_安卓模拟器安装burpsuit_CA证书 文章目录 雷电_安卓模拟器安装burpsuit_CA证书雷电模拟器官网:https://www.ldmnq.com 安装burpsuit证书1 打开雷电模拟器右上角的winfi图标 -->点击齿轮2 修改网络3 选择高级 —》手动4 查看真实机IP的地址,选择虚…

为什么多线程会带来性能问题?

为什么多线程会带来性能问题? 什么是性能问题 在上一篇中,我们已经学习了多线程带来的线程安全问题,但对于多线程而言,它不仅可能会带来线程安全问题,还有可能会带来性能问题,也许你会奇怪,我…

刚刚:腾讯云3年轻量2核2G4M服务器优惠价格366元三年

腾讯云3年轻量2核2G4M服务器,2023双十一优惠价格366元三年,自带4M公网带宽,下载速度可达512KB/秒,300GB月流量,50GB SSD盘系统盘,腾讯云百科txybk.com分享腾讯云轻量2核2G4M服务器性能、优惠活动、购买条件…

mac vscode 使用 clangd

C 的智能提示 IntelliSense 非常不准,我们可以使用 clangd clangd 缺点就是配置繁琐,优点就是跳转和提示代码精准 开启 clangd 之后会提示你关闭 IntelliSense 1、安装插件 clangd 搜索第一个下载多的就是 2、配置 clangd 可执行程序路径 clangd 插…

react实现步进器

创建一个步进器组件,包含当前步骤(currentStep)的状态以及前进和后退的操作: import React, { useState } from react;function Stepper() {const [currentStep, setCurrentStep] useState(1);const handleNext () > {setCu…

环形链表(C++解法)

题目 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#…

如何能够在发现问题和提问的时候一并带出自己的解决方案

1. 充分理解问题: 在提出问题之前,确保你已经完全理解了问题的本质。从不同的角度分析问题,确保没有遗漏任何重要的信息或者上下文。 2. 进行自我调查和研究: 在向他人寻求帮助之前,尝试自己解决问题。利用网络资源…

【proteus】8086 写一个汇编程序并调试

参考书籍:微机原理与接口技术——基于8086和Proteus仿真(第3版)p103-105,p119-122. 参考程序是p70,例4-1 在上一篇的基础上: 创建项目和汇编文件 写一个汇编程序并编译 双击8086的元件图: …