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

单例设计模式(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());}   

在这里插入图片描述

相关文章:

单例设计模式(3)

单例模式&#xff08;3&#xff09; 实现集群环境下的分布式单例类 如何理解单例模式中的唯一性&#xff1f; 单例模式创建的对象是进程唯一的。以springboot应用程序为例&#xff0c;他是一个进程&#xff0c;可能包含多个线程&#xff0c;单例代表在这个进程的某个类是唯一…...

将jupyter notebook文件导出为pdf(简单有效)

1.打开jupyter notebook笔记&#xff1a; 2.点击file->print Preview 3.在新打开的页面右键打印 4.另存为PDF 5.保存即可 6.pdf效果 &#xff08;可能有少部分图片显示不了&#xff09; 网上也有其他方法&#xff0c;比如将其转换为.tex再转为PDF等&#xff0c;但个人觉…...

使用INSERT INTO ... ON DUPLICATE KEY UPDATE批量插入更新导入excel数据的实践场景应用

INSERT INTO ... ON DUPLICATE KEY UPDATE 是 MySQL 中的一个非常有用的语法&#xff0c;它允许你在插入新记录时&#xff0c;如果记录的唯一键&#xff08;如主键或唯一索引&#xff09;已存在&#xff0c;则执行更新操作而不是插入。这可以帮助你避免在插入数据时产生的重复键…...

AJAX-项目优化(目录、基地址、token、请求拦截器)

目录管理 基地址存储 在utils/request.js配置axios请求基地址 作用&#xff1a;提取公共前缀地址&#xff0c;配置后axios请求时都会baseURLurl 填写API的公共前缀后&#xff0c;将js文件导入到html文件中 <script src"../../utils/request.js"></script&…...

SQLite中的动态内存分配(五)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite中的原子提交&#xff08;四&#xff09; 下一篇:自己编译SQLite或将SQLite移植到新的操作系统&#xff08;六&#xff09; ​概述 SQLite使用动态内存分配来获得 用于存储各种对象的内存 &#xff08;例如…...

快速上手Spring Cloud 十一:微服务架构下的安全与权限管理

快速上手Spring Cloud 一&#xff1a;Spring Cloud 简介 快速上手Spring Cloud 二&#xff1a;核心组件解析 快速上手Spring Cloud 三&#xff1a;API网关深入探索与实战应用 快速上手Spring Cloud 四&#xff1a;微服务治理与安全 快速上手Spring Cloud 五&#xff1a;Spring …...

如何简化多个 if 的判断结构

多少算太多&#xff1f; 有些人认为数字就是一&#xff0c;你应该总是用至少一个三元运算符来代替任何单个 if 语句。我并不这样认为&#xff0c;但我想强调一些摆脱常见的 if/else 意大利面条代码的方法。 我相信很多开发人员很容易陷入 if/else 陷阱&#xff0c;不是因为其…...

发掘服务器硬件优势:怎样有效管理、维护、更新

1. 概述 服务器是许多信息技术的核心&#xff0c;通过提供计算和存储资源&#xff0c;以用于企业和机构的数据处理和存储。服务器硬件也是服务器的核心组成部分&#xff0c;在服务器架构和配置中扮演着重要角色。 服务器硬件的优势&#xff1a; - 提供更高的性能和处理能力。…...

SD卡备份和烧录ubuntu20.04镜像

设备及系统&#xff1a;nuc幻影峡谷工控机&#xff0c;ubuntu20.04&#xff0c;树莓派4B&#xff0c;SD卡读卡器 一、确定SD卡设备号的两种方法 方法1&#xff1a; 将有ubuntu镜像的SD卡插入读卡器&#xff0c;再将读卡器插入电脑主机&#xff0c;在 工具 中打开 磁盘&#…...

短视频账号矩阵系统/开发 -- -- -- 蒙太奇算法上线

短视频账号矩阵系统&#xff0c;短视频矩阵系统开发3年技术之路&#xff0c;目前已经在技术竞品出沉淀出来&#xff0c;近期技术迭代的新的功能同步喽&#xff1a; php7.4版本&#xff0c;自研框架&#xff0c;有开发文档&#xff0c;类laravel框架 近期剪辑迭代的技术算法&am…...

Docker Stack(堆栈) 部署多服务集群,多服务编排

1、Docker Stack简介 Docker Stack(堆栈) 是在 Swarm 上管理服务堆栈的工具。而在以前文章docker swarm集群搭建 介绍的 Docker Swarm 只能实现对单个服务的简单部署&#xff0c;于是就引出了Docker Stack。 上面我们介绍到 docker-compose&#xff1a;可以在一台机器上使用…...

全国青少年软件编程(Scratch)等级考试二级考试真题2023年12月——持续更新.....

青少年软件编程(图形化)等级考试试卷(二级) 分数:100 题数:37 一、单选题(共25题,共50分) 1.在制作推箱子游戏时,地图是用数字形式储存在电脑里的,下图是一个推箱子地图,地图表示如下: 第一行(111111) 第二行(132231) 第三行(126621) 第四行( ) 第五行(152…...

python基础——异常捕获【try-except、else、finally】

&#x1f4dd;前言&#xff1a; 这篇文章主要介绍一下python基础中的异常处理&#xff1a; 1&#xff0c;异常 2&#xff0c;异常的捕获 3&#xff0c;finally语句 &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;C语言入门基础以及python入门…...

JAVA面试大全之JVM和调优篇

目录 1、类加载机制 1.1、类加载的生命周期? 1.2、类加载器的层次? 1.3、Class.forName()和ClassLoader.loadClass()区别?...

数据可视化-ECharts Html项目实战(8)

在之前的文章中&#xff0c;我们学习了如何设置散点图涟漪效果与仪表盘动态指针效果。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢 今天的文章&#xff0c;会…...

JavaSE:继承和多态(下篇)

目录 一、前言 二、多态 &#xff08;一&#xff09;多态的概念 &#xff08;二&#xff09;多态实现条件 &#xff08;三&#xff09;多态的优缺点 三、重写 &#xff08;一&#xff09;重写的概念 &#xff08;二&#xff09;重写的规则 &#xff08;三&#xff09;重…...

springboot+mybatis项目集成p6spy输出格式化sql日志

本文背景:公司项目框架是基于springboot+mybatis的web项目,由于鄙人在使用过程中发现打印的mybatis日志每次都要粘贴出来,然后再用在线工具的格式化填充参数,很不方便,最近发现那个在线的工具打不开了,更不方便了,因此想有没有直接可以输出的填充好参数的sql语句,当然i…...

yarn安装和使用及与npm的区别

一、yarn安装和使用 要安装和使用yarn&#xff0c;您可以按照以下步骤进行操作&#xff1a; 安装Node.js&#xff1a;首先&#xff0c;您需要在您的计算机上安装Node.js。您可以从Node.js的官方网站&#xff08;https://nodejs.org/en/download/&#xff09;下载并安装适用于您…...

【3D-GS】Gaussian Splatting SLAM——基于3D Gaussian Splatting的全网最详细的解析

【3D-GS】Gaussian Splatting SLAM——基于3D Gaussian Splatting的定SLAM 3D-GS 与 Nerf 和 Gaussian Splatting1. 开山之作 Nerf2. 扛鼎之作 3D Gaussian Splatting2.1 什么是3D高斯?高斯由1D推广到3D的数学推导2.2 什么是光栅化?2.3 什么是Splatting?2.4 什么是交叉优化?…...

推荐多样性 - 华为OD统一考试(C卷)

OD统一考试(C卷) 分值: 200分 题解: Java / Python / C++ 题目描述 推荐多样性需要从多个列表中选择元素,一次性要返回N屏数据(窗口数量),每屏展示K个元素(窗口大小),选择策略: 各个列表元素需要做穿插处理,即先从第一个列表中为每屏选择一个元素,再从第二个列表…...

vue基础教程(4)——十分钟吃透vue路由router

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、路由概念二、路由使用三、创建路由对应的组件四、给整个项目一个入口总结 前言 前面的文章运行成功后&#xff0c;页面显示如下&#xff1a; 在这个页面中&#xff0c;点击Home和About都会切换右面的页面内容&#…...

使用OpenSSL指令测试椭圆曲线签名算法ECDSA

文章目录 小结问题及解决获取secp256r1的公钥和私钥DER格式使用OpenSSL及secp256r1算法获得签名使用OpenSSL及secp256r1算法对签名进行认证 参考 小结 本文记录了使用OpenSSL指令测试椭圆曲线签名算法ECDSA&#xff0c;进行了以下操作&#xff1a;生成椭圆曲线secp256r1 公私密…...

ubuntu之搭建samba文件服务器

1. 在服务器端安装samba程序 sudo apt-get install samba sudo apt-get install smbclient 2.配置samba服务 sudo gedit /etc/samba/smb.conf 在文件末尾追加入以下配置 [develop_share] valid users ancy path /home/ancy public yes writable y…...

P10—P11:Java程序的编译和运行

编译阶段&#xff08;P10&#xff09; Java程序的运行包括两个阶段&#xff1a;编译阶段、运行阶段编译阶段主要任务&#xff1a;对Java源程序&#xff08;以.java为后缀的文件&#xff09;&#xff0c;进行检查其是否符合Java的语法规则。如果符合&#xff0c;则生成字节码文…...

【Docker】Windows中打包dockerfile镜像导入到Linux

【Docker】Windows中打包dockerfile镜像导入到Linux 大家好 我是寸铁&#x1f44a; 总结了一篇【Docker】Windows中打包dockerfile镜像导入到Linux✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 今天遇到一个新需求&#xff0c;如何将Windows中打包好的dockerfile镜像给迁移…...

数据结构之单链表实现(JAVA语言+C语言)

一、理论 1 单链表结构 2 增、删、查 、改思路 &#xff08;增&#xff09;直接添加放到最后即可。按顺序添加&#xff1a;找到要修改的节点的前一个节点&#xff0c;插入新节点&#xff08;&#xff09;。&#xff08;改&#xff09;要修改的节点修改内容即可。&#xff08;…...

docker 安装Sentinel

1.拉取镜像&#xff1a;docker pull bladex/sentinel-dashboard 2.运行镜像&#xff1a;docker run --name sentinel -d -p 8858:8858 -d bladex/sentinel-dashboard 3. 访问地址&#xff1a; 本地地址&#xff1a;http://localhost:8858 (默认端口为8080) 远程地址&#xf…...

通过内网穿透、域名解析实现本地服务部署到公网的架构设计方案

本文主要是总结这些年自己在家玩互联网服务的心得收获, 同时随着年龄增大, 发现脑子确实越来越不好用, 只有记录到笔记中才是真正有意义的。 学生时期做了一些实验, 比如给实验室做日报系统、管理10多台服务器&#xff0c;当时学习了很多架构设计的知识&#xff0c;比如集群化…...

语音陪玩交友软件系统程序-app小程序H5三端源码交付,支持二开!

电竞行业的发展带动其周边产业的发展&#xff0c;绘制着游戏人物图画的抱枕、鼠标垫、海报销量极大&#xff0c;电竞游戏直播、游戏教程短视频也备受人们喜爱&#xff0c;自然&#xff0c;像游戏陪练、代练行业也随之生长起来&#xff0c;本文就来讲讲&#xff0c;从软件开发角…...

import关键字的使用

- import : 导入 - import语句来显式引入指定包下所需要的类。相当于import语句告诉编译器到哪里去寻找这个类。为了使用定义在其它包中的 Java 类&#xff0c;需用 import 语句来显式引入指定包下所需要的类。相当于 import 语句告诉编译器到哪里去寻找这个类 。 语法格式 …...

淘宝网站建设的目标是什么意思/营销失败案例分析

使用python setup.py install 折腾了半天没办法解决&#xff0c;最终用 “pip install 包名” 这个办法解决了。 以后忠诚的爱上了pip了 numpy不要轻易升级&#xff0c;升级可能会出现很多问题&#xff0c;如果升级之后出现了问题&#xff0c;可以进入相关目录中删除numpy文…...

wordpress主题添加评论框/aso优化什么意思是

刚开始用的是where进行多表关联查询&#xff0c;但是最终发现当中奖表中么有数据的时候是查找不到任何信息的&#xff0c;改用LEFT JOIN 用这个就很简单了&#xff0c;代码如下DESC SELECT * FROM enet_wall_list AS lLEFT JOIN enet_wall_lottery AS lottery ON l.openid l…...

网站的二级目录是什么/汕头seo排名

1.安装依赖&#xff08;内网环境 挂载光盘&#xff09;本文链接原创&#xff1a; 我照着此文部署 yum -y install gcc gcc-c autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 gli…...

深圳横岗网站建设/seowhy论坛

很久以来&#xff0c;我一直都有这样两个困惑&#xff1a; 统计专业学习编程应该系统学习还是遇到问题再找答案&#xff1f;要不要写博客&#xff1f;写博客对自己的编程水平有多大提升&#xff1f;把自己的技术全部分享出去是不是会被超越&#xff1f; 最近我才把这两个问题彻…...

自己会网站开发如何赚钱/重庆网站seo推广公司

理解 Java 的 GC 与 幽灵引用 Java 中一共有 4 种类型的引用 : StrongReference、 SoftReference、 WeakReference 以及 PhantomReference (传说中的幽灵引用 呵呵), 这 4 种类型的引用与 GC 有着密切的关系, 让我们逐一来看它们的定义和使用场景 : 1. St…...

WordPress支持熊掌号/百度官方优化软件

一个脚本可以使得本来要用键盘进行的相互式操作自动化。一个 Shell 脚本主要 由原本需要在命令行输入的命令组成&#xff0c; 或在一个文本编辑器中&#xff0c; 用户可以使用脚 本来把一些常用的操作组合成一组串行。 主要用来书写这种脚本的语言叫做脚本 语言。 很多脚本语言…...