单例设计模式(3)

单例模式(3)

实现集群环境下的分布式单例类

如何理解单例模式中的唯一性?
  • 单例模式创建的对象是进程唯一的。以springboot应用程序为例,他是一个进程,可能包含多个线程,单例代表在这个进程的某个类是唯一的,在不同的线程中类是相同的。
如何实现线程唯一的单例?
/*** 线程中的单例*/
public class ThreadIdGenrator {private static final Map<Long, ThreadIdGenrator> map = new ConcurrentHashMap<>();private AtomicInteger id = new AtomicInteger(0);public static ThreadIdGenrator getInstance() {long threadId = Thread.currentThread().getId();ThreadIdGenrator threadIdGenrator = map.putIfAbsent(threadId, new ThreadIdGenrator());return threadIdGenrator;}public int nextInt() {return id.incrementAndGet();}
}
如何实现集群环境下的单例?
  • 我们需要把这个单例对象序列化并存储到外部共享存储区(比如文件)。进程在使用这个单例对象的时候,需要先从外部共享存储区中将它读取到内存,并反序列化成对象,然后再使用,使用完成之后还需要再存储回外部共享存储区。

  • 为了保证任何时刻,在进程间都只有一份对象存在,一个进程在获取到对象之后,需要对对象加锁,避免其他进程再将其获取。在进程使用完这个对象之后,还需要显式地将对象从内存中删除,并且释放对对象的加锁。

  • 问题:这里为什么要加锁

    • 理由:如果多个进程读取同一份序列化文件,得到的对象的地址是不一样的,这样子就无法保证全局的唯一性;
    • 序列化后的对象与原对象只是值相等但是对象的地址是不相等
    • 为了保证全局的唯一性,必须保证在集群下,在使用单例对象时,需要加锁,当多线程使用时,只有一个线程可以使用成功,其他线程必须阻塞
import java.util.concurrent.atomic.AtomicLong;public class IdGenerator {private AtomicLong id = new AtomicLong(0);private static IdGenerator instance;private static SharedObjectStorage storage = FileSharedObjectStorage(/* 入参省略 */);private static DistributedLock lock = new DistributedLock();private IdGenerator() {}public static IdGenerator getInstance() {if (instance == null) {lock.lock();instance = storage.load(IdGenerator.class);lock.unlock(); // 放置于try-finally块内确保解锁}return instance;}public void freeInstance() {lock.lock();try {storage.save(this, IdGenerator.class);instance = null; // 释放对象} finally {lock.unlock();}}public long getId() {return id.incrementAndGet();}
}
如何实现一个多例模式?
  • 多例的理解
    • “多例”指的就是,一个类可以创建多个对象,但是个数是有限制的
    • 同一类型的只能创建一个对象,不同类型的可以创建多个对象
      • 类型:同一个 name 获取到的对象实例是相同的
      • 以ID生成器为例:我希望在用户注册时使用的是一个ID生成器;在增加商品时,使用的是另一个ID生成器,即根据场景划分使用不同的ID生成器
public class DuoLiIdGenertor {private static final Map<String, DuoLiIdGenertor> map = new ConcurrentHashMap<>();private AtomicInteger id = new AtomicInteger(0);public static DuoLiIdGenertor getInstance(String name) {map.putIfAbsent(name, new DuoLiIdGenertor());return map.get(name);}public int nextInt() {return id.incrementAndGet();}}public static void main(String[] args) {DuoLiIdGenertor user = getInstance("user");DuoLiIdGenertor goods = getInstance("goods");DuoLiIdGenertor user1 = getInstance("user");System.out.println(user.hashCode());System.out.println(goods.hashCode());System.out.println(user1.hashCode());}   

在这里插入图片描述

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

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

相关文章

ROS 2边学边练(6)-- 何为参数(parameters)

概念 这一知识点&#xff0c;应该很好理解&#xff0c;参数就是节点的属性&#xff0c;比如猫科动物&#xff0c;它所拥有的属性&#xff08;参数&#xff09;有胡子、能伸缩的爪子、随光线缩放自如的瞳孔、夜视能力、优秀的弹跳力、萌等等。ROS节点中参数支持的数据类型有整型…

Springboot中的三层架构

我们在进行前后端交互的时候&#xff0c;会分为数据访问&#xff0c;业务逻辑&#xff0c;接受请求并响应数据三个操作&#xff0c;这三部分其实是可以拆分的&#xff0c;让他们解耦&#xff0c;否则代码复用性差并且不易维护&#xff0c;所以诞生了三层架构——1.Dao(数据访问…

VuePress基于 Vite 和 Vue 构建优秀框架

VitePress 是一个静态站点生成器 (SSG)&#xff0c;专为构建快速、以内容为中心的站点而设计。简而言之&#xff0c;VitePress 获取用 Markdown 编写的内容&#xff0c;对其应用主题&#xff0c;并生成可以轻松部署到任何地方的静态 HTML 页面。 VitePress 附带一个用于技术文档…

Redis 常见数据结构及命令

目录 一.Redis常见的数据结构 二.Redis数据结构对应的命令 1.String类型 2.Hash类型 3.List类型 4.Set类型 5.Sorted Set类型 一.Redis常见的数据结构 Redis支持多种数据结构&#xff0c;包括字符串&#xff08;string&#xff09;、哈希&#xff08;hash&#xff09;、…

【Linux】认识线程池 AND 手撕线程池(正常版)

文章目录 0.回顾进程池1.计算机层面的池化技术2.线程池预备知识2.1介绍线程池2.2设计线程池的意义是什么&#xff1f;2.3其他知识 3.回顾C类与对象3.1cpp什么情况下成员函数必须是静态的&#xff1f;3.1可变参数列表3.2格式化输出函数3.3预定义符号 4.图解线程池运作原理4.0完整…

Java_22 蓝桥杯真题——拼数

问题描述 给定几 个正整数 a1,a2....,an&#xff0c;你可以将它们任意排序, 现要将这 几 个数字连接成一排&#xff0c;即令相邻数字收尾相接&#xff0c;组成一个数。 问&#xff0c;这个数最大可以是多少。 输入格式 第一行输入个正整数 n(l < n< 20)。 第二行输入几 个…

二维码门楼牌管理应用平台建设:一扫即知,智慧生活新篇章

文章目录 前言一、二维码门楼牌管理的创新之处二、二维码门楼牌管理应用平台的实际应用三、二维码门楼牌管理应用平台的未来展望 前言 随着信息技术的飞速发展&#xff0c;二维码门楼牌管理应用平台应运而生&#xff0c;为城市管理和居民生活带来了极大的便利。只需轻轻一扫&a…

JVM 八股(一)

JVM 1.类装载的执行过程 加载&#xff1a; 元空间存储构造函数&#xff0c;方法&#xff0c;字段等 验证 准备 解析 初始化 使用 2.垃圾回收 什么是垃圾回收&#xff1f;怎样找到这些垃圾&#xff1f;找到垃圾后是怎么清除的&#xff08;垃圾回收算法&#xff09;&#x…

减少样式计算的范围和复杂度

本文翻译自 Reduce the scope and complexity of style calculations&#xff0c;作者&#xff1a;Jeremy Wagner&#xff0c; 略有删改。 JavaScript通常用来改变页面的视觉效果。比如通过改变style样式或者通过计算后改变页面布局&#xff0c;比如搜索或排序数据。长时间运行…

.NET 开发支持技术路线 .Net 7 将停止支持

.NET 开发技术路线图 微软方面强调&#xff0c;使用 .NET 7 的应用程序将在支持结束后继续运行&#xff0c;但用户可能无法获得 .NET 7 应用程序的技术支持。他们不会继续为 .NET 7 发布新的安全更新&#xff0c;用户可能会面临安全漏洞问题。 开发人员必须使用 .NET 8 SDK 构建…

蓝桥杯第七届大学B组详解

目录 1.煤球数量&#xff1b; 2.生日蜡烛&#xff1b; 3.凑算式 4.方格填数 5.四平方和 6.交换瓶子 7.最大比例 1.煤球数量 题目解析&#xff1a;可以根据题目的意思&#xff0c;找到规律。 1 *- 1个 2 *** 3个 3 ****** 6个 4 ********** 10个 不难发现 第…

安科瑞路灯安全用电云平台解决方案【电不起火、电不伤人】

背景介绍 近年来 &#xff0c;随着城市规模的不断扩大 &#xff0c;路灯事业蓬勃发展。但有的地方因为观念、技术、管理等方面不完善 &#xff0c;由此引发了一系列安全问题。路灯点多面广 &#xff0c;一旦漏电就极容易造成严重的人身安全事故。不仅给受害者家庭带来痛苦 &am…

计算方法实验3:反幂法求按模最小特征值及特征向量

Task Algorithm LU-Doolittle分解 A L U \mathbf{A}\mathbf{L}\mathbf{U} ALU 其中 L \mathbf{L} L为单位下三角阵, U \mathbf{U} U为上三角阵. 则 A x b \mathbf{A}\mathbf{x}\mathbf{b} Axb可化为 L U x L y b \mathbf{L}\mathbf{U}\mathbf{x}\mathbf{L}\mathbf{y}\math…

STM32的简介

内存 一般MCU包含的存储空间有FLASH和RAM,&#xff08;RAM和flash又有片上和片外的区别&#xff0c;片上表示mcu自带的&#xff0c;已经封装在MCU内部的&#xff0c;片外表示外挂的&#xff0c;当项目中需要做一些复杂的应用&#xff0c;会存在资源不足的情况&#xff0c;这时…

JavaScript基础语法–变量

文章目录 认识JavaScript变量程序中变量的数据&#xff08;记录&#xff09;–变量变量的命名格式在Java script中变量定义包含两部分1. 变量声明&#xff08;高级JS引擎接下来定义一个变量&#xff09;2. 其他的写法 变量命名的规范&#xff08;遵守&#xff09;变量的练习a. …

【微信】公众号开发

文章目录 概述与微信交互环境准备开发者工具 注册公众号服务器基本配置存取access_token示例代码来源 概述 不同类型公众号主要区别 与微信交互 实际上我们在公众号里的所有操作&#xff0c;都会发送到微信的服务器上&#xff0c;微信服务器将这些动作的具体含义按照一定的…

PWM波输出-定时器输出比较单元

目录 1&#xff0c;前言 2&#xff0c;实现过程 2.1 比较部分 2.2 输出部分 1&#xff0c;前言 电平&#xff0c;作为单片机的“肌肉”&#xff0c;承担着实践单片机的“想法“的重要任务。而PWM波&#xff0c;则是电平这个大类的重中之重&#xff0c;可以说&#xff0c;没…

STM32的芯片无法在线调试的情况分析

问题描述 本博客的目的在于帮助网友尽快地解决问题&#xff0c; 避免浪费时间&#xff0c; 查漏补缺。 在stm32的开发过程中&#xff0c;有时会遇到"STM No Target connected"的错误提示&#xff0c;这说明MDK开发环境无法与目标设备进行通信&#xff0c;导致无法烧…

YOLOv9改进策略 :注意力机制 | 注意力机制与卷积的完美融合 | 最新移动端高效网络架构 CloFormer

💡💡💡本文改进内容: 引入CloFormer 中的 AttnConv,上下文感知权重使得模型能够更好地适应输入内容。相比于局部自注意力机制,引入共享权重使得模型能够更好地处理高频信息,从而提高性能。 💡💡💡注意力机制与卷积的完美融合 AttnConv | 亲测在多个数据集能够…

windows安全中心设置@WindowsDefender@windows安全中心常用开关

文章目录 abstractwindows defender相关服务&#x1f47a; 停用windows Defender临时关闭实时防护使用软件工具关闭defender control(慎用)dismdControl 其他方法使其他杀毒软件注册表修改 保护历史恢复被认为是有病毒的文件添加信任目录,文件,文件类型或进程 abstract window…