- 博客(80)
- 收藏
- 关注
原创 单点登录这么做,真好用!
每个动态密码卡都有一个唯一的密钥,该密钥同时存放在服务器端,每次认证时动态密码卡与服务器分别根据同样的密钥,同样的随机参数(时间、事件)和同样的算法计算了认证的动态密码,从而确保密码的一致性,从而实现了用户的认证。同样的密码每次使用 bcrypt 编码,密码暗文都是不一样的。但是有时要针对特定的用户、特定的应用进行二次密码校验的功能,防止关键系统的登录,导致的信息敏感泄露,比如财务系统或者个人工资账单,在实际工作中经常出现工作代理的情况,即使出现单点登录的密码泄露,二次密码也很好地保护敏感应用系统;
2024-11-04 14:22:46 354
原创 有了这个谁还用破解软件啊?
这个时候就需要你完全移除破解脚本了,再不行就卸载重装(最直接),当然如果你有专研精神,你可以仔细研究怎么一步一步彻底移除破解残留。需要哪里点哪里,再也不用那些繁琐的安装步骤了,官方的管理软件对软件和插件版本校验适配更好,非常推荐。非商业版免费使用,需要你登录你自己的JetBrains账号,登录上去之后就可以了。对于WebStorm安装完成后直接打开就行了,到注册弹窗这里就有变化了。Rider打开的时候可能会有相关提示,个人按需选择即可。软件进行安装/更新,非常方便,一键即可安装。
2024-10-28 09:31:59 343
原创 一篇文章告诉你什么是BloomFilter
缓存宕机、缓存击穿场景,一般判断用户是否在缓存中,如果在则直接返回结果,不在则查询db,如果来一波冷数据,会导致缓存大量击穿,造成雪崩效应,这时候可以用布隆过滤器当缓存的索引,只有在布隆过滤器中,才去查询缓存,如果没查询到,则穿透到db。我们写的这些早有大牛帮我们实现,还造轮子,真是浪费时间,No,No,No,我们学习过程中是可以造轮子的,造轮子本身就是我们自己对设计和实现的具体落地过程,不仅能提高我们的编程能力,在造轮子的过程中肯定会遇到很多我们没有思考过的问题,成长看的见~~(比如上图中的第 3 位)
2024-10-26 09:31:31 1001
原创 Mysql索引一篇就够了
因为非叶子结点只存储索引信息,其内部节点相同 B 树更小,如果把 key 存入同一盘块中,盘块所能包含的 key 越多,一次性读入内存中需要查找的 key 就越多,相对来说磁盘的 I/O次数就减少了。,如果建立 (a,b,c,d) 顺序的索引,d 就是用不到索引的,如果建立(a,b,d,c) 的索引则都可以用到,并且 a,b,d 的顺序可以任意调整。MySQL 索引使用的是 B 树中的 B+ 树,但索引是在存储引擎层实现的,而不是在服务器层实现的,所以不同存储引擎具有不同的索引类型和实现。
2024-10-25 10:12:12 881
原创 GitHub 竟然有这些骚操作,真是涨姿势
但是这样的搜索范围太大,且项目质量参差不齐,所以在搜索结果页,还可以通过 Languages 选择实现语言,Sort 选择排序规则(按 Star 数量、Fork 数量、最近更新时间等)。https://github.com/trending 可以按语言,日期范围(本天、本周、本月)查看热度,有好多可供学习的热门项目。有时候我们要请教大佬,让大佬帮忙看看代码,可以使用高亮功能,在 GitHub 或 GitLab 中找到自己的代码,url 地址后加。前往通知面板 About notifications。
2024-10-24 10:45:43 727
原创 程序员必须掌握的消息中间件-RabbitMQ
在绑定队列和交换器时指定一组键值对,当发送消息到交换器时,RabbitMQ 会获取到该消息的 headers(也是一个键值对的形式),对比其中的键值对是否完全匹配队列和交换器绑定时指定的键值对,如果完全匹配则消息会路由到该队列,否则不会路由到该队列。如果一个队列尚不存在,声明一个队列会创建它。Queue 是消息的容器,也是消息的终点。当多个消费者订阅同一个队列时,队列中的消息会被平均分摊(Round-Robin,即轮询)给多个消费者进行处理,而不是每个消费者都收到所有的消息并处理,这样避免消息被重复消费。
2024-10-23 09:09:55 1044
原创 程序员必须掌握的消息中间件-RocketMQ
设计(design)1 消息存储消息存储是RocketMQ中最为复杂和最为重要的一部分,本节将分别从RocketMQ的消息存储整体架构、PageCache与Mmap内存映射以及RocketMQ中两种不同的刷盘方式三方面来分别展开叙述。1.1 消息存储整体架构消息存储架构图中主要有下面三个跟消息存储相关的文件构成。(1) CommitLog:消息主体以及元数据的存储主体,存储Producer端写入的消息主体内容,消息内容不是定长的。单个文件大小默认1G ,文件名长度为20位,左边补零,剩余为起始
2024-10-21 17:31:07 1028
原创 程序员必须了解的消息队列之王-Kafka
是支持分区的(partition)、多副本的(replica),基于 ZooKeeper 协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于 hadoop 的批处理系统、低延迟的实时系统、storm/Spark 流式处理引擎,web/nginx 日志、访问日志,消息服务等等。许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕。
2024-10-20 13:23:54 890
原创 浅谈消息队列及常见的消息中间件
所以,利用中间系统转储两个系统的通信内容,并在下游系统有能力处理这些消息的时候,再处理这些消息,是一套相对较通用的方式。所以,它并不需要专门的管理员,因为它提供了简单又使用的管理特性。如果你有更复杂的路由需求,可以将这些交换机组合起来使用,你甚至可以实现自己的交换机类型,并且当做。非持久订阅:订阅者为了接受消息,必须一直在线。可以使用消息队列的场景有很多,最常用的几种,是做。)基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一。,而且可以非常容易的嵌入到企业的应用环境中,并有许多高级功能。
2024-10-19 15:38:47 984
原创 常见的消息中间件看这一篇就够了
所以,利用中间系统转储两个系统的通信内容,并在下游系统有能力处理这些消息的时候,再处理这些消息,是一套相对较通用的方式。所以,它并不需要专门的管理员,因为它提供了简单又使用的管理特性。如果你有更复杂的路由需求,可以将这些交换机组合起来使用,你甚至可以实现自己的交换机类型,并且当做。非持久订阅:订阅者为了接受消息,必须一直在线。可以使用消息队列的场景有很多,最常用的几种,是做。)基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一。,而且可以非常容易的嵌入到企业的应用环境中,并有许多高级功能。
2024-10-18 09:52:07 1029
原创 什么是 BloomFilter
缓存宕机、缓存击穿场景,一般判断用户是否在缓存中,如果在则直接返回结果,不在则查询db,如果来一波冷数据,会导致缓存大量击穿,造成雪崩效应,这时候可以用布隆过滤器当缓存的索引,只有在布隆过滤器中,才去查询缓存,如果没查询到,则穿透到db。我们写的这些早有大牛帮我们实现,还造轮子,真是浪费时间,No,No,No,我们学习过程中是可以造轮子的,造轮子本身就是我们自己对设计和实现的具体落地过程,不仅能提高我们的编程能力,在造轮子的过程中肯定会遇到很多我们没有思考过的问题,成长看的见~~(比如上图中的第 3 位)
2024-10-17 16:32:43 974
原创 分享全网最全的ChatGPT资料
(DALL·E,Midjourney,ChatGPT,Stable Diffusion绘画)之后也会持续更新不错的AI网站(不会夹带私货,再说一遍,全程没有任何广告,也不会从中获利)全程没有任何广告,也不会从中获利,只是我个人觉得不错,所以将这些网站分享给大家!💰:有使用限制(全程没有任何广告,也不会从中获利)(DALL·E和Midjourney绘画)(自动获取YouTube视频的摘要或简介)(自动提取B站视频的中心思想或总结)(自动提取视频的中心思想或总结)(AI搜索,它只能告诉你答案)
2024-10-16 10:22:29 314
原创 并发专栏-CAS
从 Atomic 到 CAS❝CAS 知道吗,如何实现?讲一讲 AtomicInteger,为什么要用 CAS 而不是 synchronized?CAS 底层原理,谈谈你对 UnSafe 的理解?AtomicInteger 的ABA问题,能说一下吗,原子更新引用知道吗?CAS 有什么缺点吗? 如何规避 ABA 问题?前言Java 内存模型要保证可见性,原子性和有序性。在 JDK 5之前 Java 语言是靠 synchronized 关键字保证同步的,但 synchronized 是一种独
2024-10-15 15:04:55 648
原创 并发专栏-队列同步器 AQS 以及 Reentrantlock 应用
两个都是native本地方法。文章中反复提到过,使用多线程很重要的考量点是线程切换的开销,想象一下,如果采用非公平锁,当一个线程请求锁获取同步状态,然后释放同步状态,因为不需要考虑是否还有前驱节点,所以刚释放锁的线程在此刻再次获取同步状态的几率就变得非常大,所以就减少了线程的开销。这段代码被执行的条件是 failed 为 true,正常情况下,如果跳出循环,failed 的值为 false,如果不能跳出循环貌似怎么也不能执行到这里,所以只有不正常的情况才会执行到这里,也就是会发生异常,才会执行到此处。
2024-10-13 12:37:53 746
原创 Java 集合,你肯定也会被问到这些
方法表示在进行第一次初始化时会对其进行扩容,或者当该数组的实际大小大于其扩容阈值(第一次为0.75 * 16 = 12),这个时候在扩容的同时也会伴随的桶上面的元素进行重新分发,这也是JDK1.8版本的一个优化的地方,在1.7中,扩容之后需要重新去计算其Hash值,根据Hash值对其进行分发,但在1.8 版本中,则是根据在同一个桶的位置中进行判断(e.hash & oldCap)是否为0,重新进行hash分配后,该元素的位置要么停留在原始位置,要么移动到原始位置+增加的数组大小这个位置上。
2024-10-11 09:19:47 941
原创 Zookeeper面试这一篇就够了
(4)watcher event 异步发送 watcher 的通知事件从 server 发送到 client 是异步的,这就存在一个问题,不同的客户端和服务器之间通过 socket 进行通信,由于网络延迟或其他因素导致客户端在不通的时刻监听到事件,由于 Zookeeper 本身提供了 ordering guarantee,即客户端监听事件后,才会感知它所监视 znode发生了变化。待到同步结束,它也参与消息广播。因此,随着 zookeeper 的集群机器增多,读请求的吞吐会提高但是写请求的吞吐会下降。
2024-10-10 19:28:57 1079
原创 MySQL 三万字精华总结 + 面试100 问,和面试官扯皮绰绰有余
MySQL 三万字精华总结 + 面试100 问,和面试官扯皮绰绰有余❝写在之前:不建议那种上来就是各种面试题罗列,然后背书式的去记忆,对技术的提升帮助很小,对正经面试也没什么帮助,有点东西的面试官深挖下就懵逼了。个人建议把面试题看作是费曼学习法中的回顾、简化的环节,准备面试的时候,跟着题目先自己讲给自己听,看看自己会满意吗,不满意就继续学习这个点,如此反复,好的offer离你不远的,奥利给一、MySQL架构和其它数据库相比,MySQL 有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用
2024-10-08 09:19:14 593
原创 Java开发必知必会的一些工具
因为它结合了其他构建工具的最佳功能,例如它具有灵活性和对 Ant 的控制、Ivy 的依赖管理、Maven 的配置和插件的约定,最重要的是它在 Ant 之上使用 Groovy DSL。Kubernetes 也是采用混合云环境的重要工具,这意味着相同的代码可以在开发人员机器上运行,也可以在 AWS、GCP 和 Microsoft Azure 等不同的云环境中本地运行。其中一个工具是 JIRA,对于有经验的开发人员来说,这是必须知道的,特别是如果你的团队遵循 Sprint、Scrum 和看板等敏捷实践。
2024-10-05 09:44:08 1211
原创 在阿里工作是一种什么体验?
六险一金,股票,期权,公积金顶格交(最高单边能到8000+,顶许多人一个月工资了),这些待遇都是很好的,阿里的薪资在国内互联网的排名是数一数二的,对于表现好的员工,有时会发放股票期权奖励,甚至可能会比工资还要高。在经历了很多同一年毕业的同学实习过后即失业的惨痛经历后,我逐渐理解了团队同事的这句话:是的,熟悉整个研发流程,从系统设计,代码开发,测试联调,发布上线,问题排查都不仅是你的职责,还理所应得地该成为你的横向拓展能力。我来阿里工作已经一年了,回顾起自己的一年,最大的感受就是累,而累完了就是一种充实。
2024-10-04 11:54:05 631
原创 JVM类加载机制
JVM 中区分不同类,不仅仅是根据类名,相同的 class 文件被不同的 ClassLoader 加载就属于两个不同的类(比如,Java中的Object类,无论哪一个类加载器要加载这个类,最终都是委派给处于模型最顶端的启动类加载器进行加载,如果不采用双亲委派模型,由各个类加载器自己去加载的话,系统中会存在多种不同的 Object 类)在 Java 的日常应用程序开发中,类的加载几乎是由 3 种类加载器相互配合执行的,在必要时,我们还可以自定义类加载器,来定制类的加载方式。
2024-10-04 11:53:12 1444
原创 详解JVM类加载机制
在某些场景下,如果动态加载类过多,容易产生 Perm 区的 OOM。的值为20.75MB,这就是初始的高水位线,一旦触及这个水位线,Full GC 将会被触发并卸载没用的类(即这些类对应的类加载器不再存活),然后这个高水位线将会重置,新的高水位线的值取决于 GC 后释放了多少元空间。永久代物理是堆的一部分,和新生代,老年代地址是连续的(受垃圾回收器管理),而元空间存在于本地内存(我们常说的堆外内存,不受垃圾回收器管理),这样就不受 JVM 限制了,也比较难发生OOM(都会有溢出异常)
2024-10-03 20:28:56 1178
原创 为什么要用B+树?
比如,我们写入了三条数据,这三条数据本身写入的时候是排好序的,那么此时范围查找时,我们只要定位到第一条数据,后面的数据是有序的,就可以很快进行按序读取了。在我们的抽象和改进中,引入了页的概念,磁盘中按照页的单位来组织数据,页内部保存的数据有序存储,页间数据也是有序存储。我们都知道,我们的数据存储在硬盘上,因此当用户的请求(读/写)进来后,首先会到操作系统管理的内存中,在内存中进行一些逻辑处理,然后 cpu 会发送指令从硬盘读取数据到内存中,最后就会响应上层用户(读:读取的数据、写:写数据是否成功等)。
2024-09-30 17:01:28 808
原创 到底什么是认证
JWT 的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该 token 也可直接被用于认证,也可被加密。如果你的用户通过社交账号登录,例如微信登录,微信作为身份提供商会颁发自己的 Access Token,你的应用可以利用 Access Token 调用微信相关的 API。你的应用必须安全地存储 Refresh Token,它的重要性和密码是一样的,因为 Refresh Token 能够一直让用户保持登录。
2024-09-30 09:30:09 572
原创 DDD领域驱动设计实战-分层架构
用户接口层在于前后端调用的适配。仓储本身属基础层,但考虑到一个聚合对应一个仓储,为了以后聚合代码整体迁移方便,在微服务代码目录设计时,在聚合目录下增加一个Repository的仓储目录,跟仓储相关的代码都在这个目录下。实体和领域服务在实现业务逻辑上不是同级,当领域中的某些功能,单一实体或值对象无法实现,就会用到领域服务,它可组合聚合内的多个实体或值对象,实现复杂业务逻辑。当发现微服务1中聚合a的功能经常被高频访问,以致拖累了整个微服务1的性能,可把聚合a,从微服务1中剥离,独立为微服务2以应对高性能场景。
2024-09-29 09:14:07 807
原创 单体到微服务架构服务演化过程
云原生应用的关键属性包括了:使用轻量级的容器打包、使用最合适的语言和框架开发、以松耦合的微服务方式设计、以 API 为中心的交互和协作、无状态和有状态服务在架构上界限清晰、不依赖于底层操作系统和服务器、部署在自服务、弹性的云基础设施上、通过敏捷的 DevOps 流程管理、自动化能力、通过定义和策略驱动的资源分配。SOA 偏向水平服务,微服务偏向垂直服务;对应的是服务开发,实现了源代码托管,你只需要关注你的代码实现,而不需要关心你的代码在哪,因为在整个开发过程中你都不会感受到代码库和代码分支的存在。
2024-09-28 11:19:54 1245
原创 DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍
DeepSpeed-Chat流程的前两步与大型模型的常规微调相似,得益于基于ZeRO的内存管理优化和DeepSpeed训练中的并行策略灵活组合,实现了规模和速度的提升。此外,我们在第三阶段中添加的两个重要可选功能,包括指数移动平均(EMA)收集和混合训练,将产生额外的内存和训练成本。如图2所示,DeepSpeed训练和推理引擎之间的过渡是无缝的:通过为actor模型启用典型的eval和train模式,当运行推理和训练流程时,DeepSpeed选择其不同的优化来运行模型更快并提高整个系统吞吐量。
2024-09-27 11:09:43 831
原创 Kafka消费者群组和负载均衡
点对点的应用场景也很多,因为它的数据只能被一个消费者使用,比如可以削峰,比如上游服务发送了很多数据过来,如果下游服务的就只有一个消费者实例,那么就可能造成消息的积压,这时候就可以多开几个消费者实例一起消费,就加快了消息的消费速度,不过也得考虑一些因素,比如消息的顺序。点对点模式就是一对一模式,如微信、QQ的两个人聊天,在kafka中要使用点对点模式,那么我们还是要回到一个分区只能被同一个消费组内的消费者消费这个问题上,我们创建了一个消费组,每个分区的数据只能被这个消费组内的消费者消息,就实现了点对点模式。
2023-10-08 11:09:18 386
原创 Kafka在企业级应用中的实践
通过 Kafka Connect,企业可以轻松地实现数据的导入和导出,与各种数据源(如数据库、文件系统)进行集成,并且可以自定义开发 Connectors,与特定的数据源进行交互。Kafka Streams 提供了高性能的流处理和事件驱动的架构,并且与 Kafka 生态系统的其他组件无缝集成,提供了可扩展、容错的流处理解。消费者可以根据需求选择不同的消费模式,如订阅所有消息或只订阅特定分区的消息。通过使用 Kafka 进行消息的异步处理,企业可以实现高效、可伸缩的系统架构,并且降低各个组件之间的耦合程度。
2023-10-08 11:01:12 688 2
原创 Kafka的分布式架构与高可用性
例如,云端部署了一个应用,它需要访问 IDC 里的数据,IDC 里的应用程序负责更新这个数据,并保存在本地的数据库中。任何集群服务都会收到天灾、人祸等因素影响稳定性,比如地震,火灾,高温、超低温等等,Kafka 集群可能因为这些不可预估的原因导致不可用,这时就需要有另外的与第一个集群完全相同的集群。在项目比较大的时候,可能需要在多个地域部署中心服务,以增加系统的容灾能力和业务能力,每个数据中心都有自己的 Kafka 集群,这里就涉及到应用和Kafka集群之间的访问,是本地访问还是跨中心访问。
2023-10-08 10:50:03 455
原创 HashMap常见面试题
因为在 HashMap 的链表结构中遍历判断的时候,特定情况下重写的 equals 方法比较对象是否相等的业务逻辑比较复杂,循环下来更是影响查找效率。扩容时,重新将键值对存储新的桶数组里,键的键之间产生的碰撞会下降,链表长度变短。相反,如果增加负载因子(负载因子可以大于1),HashMap 所能容纳的键值对数量变多,空间利用率高,但碰撞率也高。HashMap 按当前桶数组长度的2倍进行扩容,阈值也变为原来的2倍(如果计算过程中,阈值溢出归零,则按阈值公式重新计算)。如果是普通节点,则节点按原顺序进行分组。
2023-09-24 20:09:11 288
原创 Kafka的消息存储机制
每当往某个Topic发送数据时,数据会被hash到不同的partition,这些partition位于不同的集群节点上,所以每个消息都会被记录一个offset消息号,随着消息的增加逐渐增加,这个offset也会递增,同时,每个消息会有一个编号,就是offset号。消费者有消费者族群的概念,当生产者将数据发布到topic时,消费者通过pull的方式,定期从服务器拉取数据,当然在pull数据的时候,,服务器会告诉consumer可消费的消息offset。确保足够的磁盘带宽:Kafka的存储性能受限于磁盘带宽。
2023-09-24 19:47:12 747
原创 ArrayList常见面试题
之前放在构造方法中。ArrayList是我们开发中非常常用的数据存储容器之一,其底层是数组实现的,我们可以在集合中存储任意类型的数据,ArrayList是线程不安全的,非常适合用于对元素进行查找,效率非常高。是一个缓存数组,它通常会预留一些容量,等容量不足时再扩充容量,那么有些空间可能就没有实际存储元素,采用上诉的方式来实现序列化时,就可以保证只序列化实际存储的那些元素,而不是整个数组,从而。计算容量:如果elementData是空,则返回默认容量10和size+1的最大值,否则返回size+1。
2023-09-24 19:31:43 564
原创 消息队列中,如何保证消息的顺序性?
比如,生产者向 RabbitMQ 里发送了三条数据,顺序依次是 data1/data2/data3,压入的是 RabbitMQ 的一个内存队列。生产者在写的时候,其实可以指定一个 key,比如说我们指定了某个订单 id 作为 key,那么这个订单相关的数据,一定会被分发到同一个 partition 中去,而且这个 partition 中的数据一定是有顺序的。这是生产系统中常见的问题。一个 topic,一个 partition,一个 consumer,内部单线程消费,单线程吞吐量太低,一般不会用这个。
2023-09-23 12:42:22 282
原创 Kafka的消息传递保证和一致性
ISR中的副本数量越多,数据的复制同步需要的时间越长,但副本的可用性和数据一致性也更高。当宕机的Leader恢复,发现新的Leader中的数据和自己持有的数据不一致,此时宕机的Leader会将自己的数据截断到宕机之前的HW位置,然后同步新Leader的数据。HW的截断机制:新的Leader并不能保证已经完全同步了之前Leader的所有数据,只能保证HW之前的数据是同步过的,此时所有的Follower都要将数据截断到HW的位置,再和新的Leader同步数据,来保证数据一致。
2023-09-23 12:37:48 688
原创 Kafka入门
将消息发给 consumer,kafka 只保证按一个 partition 中的消息的顺序,不保证一个 topic 的整体(多个 partition 间)的顺序。用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。:一个Topic是消息的分类或主题,它是Kafka中进行消息发布和订阅的基本单位。
2023-09-23 12:31:28 248
原创 SQLite 3.43 发布,性能大提升!
总之,发布的SQLite 3.43版本极大地提升了处理JSON数据的性能,使开发人员能够更高效地处理和操作JSON数据。此外,还增加了一些新的与JSON相关的函数,提升了对JSON数据的灵活处理能力。例如,新增了一些日期/时间函数,增加了多达11个新的内置SQL函数,优化了查询计划的生成效果等。SQLite是一种被广泛运用的嵌入式关系型数据库管理系统,最新发布的SQLite 3.43版本带来了一个重要的改进,大幅提升了对JSON数据的处理性能,达到了之前的两倍。新增 timediff() SQL 函数。
2023-09-22 11:21:51 788
原创 单例模式有几种写法?
可惜的是,正如注释中所说,DCL仍然是线程不安全的,由于指令重排序,你可能会得到“半个对象”,即”部分初始化“问题。针对变种1中单例初始化后锁仍然无法避开的问题,变种2在变种1的外层又套了一层check,加上synchronized内层的check,即所谓“双重检查锁”(Double Check Lock,简称DCL)。代码量比饿汉模式更少。相对于饿汉模式,Holder模式仅增加了一个静态内部类的成本,与饱汉的变种3效果相当(略优),都是比较受欢迎的实现方式。饱汉,即已经吃饱,不着急再吃,饿的时候再吃。
2023-09-22 11:19:24 278
原创 Redis中是如何实现分布式锁的?
其次,由于我们对锁设置了过期时间,即使锁的持有者后续发生崩溃而没有解锁,锁也会因为到了过期时间而自动解锁(即key被删除),不会发生死锁。我们可以看到,RedissonLock是可重入的,并且考虑了失败重试,可以设置锁的最大等待时间, 在实现上也做了一些优化,减少了无效的锁申请,提升了资源的利用率。如果存储锁对应key的那个节点挂了的话,就可能存在丢失锁的风险,导致出现多个客户端持有锁的情况,这样就不能实现资源的独享了。客户端计算建立好锁的时间,如果建立锁的时间小于超时时间,就算建立成功了;
2023-09-22 11:15:29 291
原创 并发编程系列-CAS
自旋CAS如果长时间不成功,会给CPU带来非常大的执行开销。在JDK1.5之前,如果不编写明确的代码就无法执行CAS操作,在JDK1.5中引入了底层的支持,在int、long和对象的引用等类型上都公开了CAS的操作,并且JVM把它们编译为底层硬件提供的最有效的方法,在运行CAS的平台上,运行时把它们编译为相应的机器指令,如果处理器/CPU不支持CAS指令,那么JVM将使用自旋锁。简单来说,CAS 的含义是“我认为原有的值应该是什么,如果是,则将原有的值更新为新值,否则不做修改,并告诉我这个值现在是多少”。
2023-09-22 10:59:04 106
原创 说说hashCode() 和 equals() 之间的关系?
如果两个由equals()规定相等的对象生成的hashCode不等,对于hashMap来说,他们很可能分别映射到不同位置,没有调用equals()比较是否相等的机会,两个实际上相等的对象可能被插入不同位置,出现错误。如果一个key对象在put的时候调用hashCode()决定了存放的位置,而在get的时候调用hashCode()得到了不一样的返回值,这个值映射到了一个和原来不一样的地方,那么肯定就找不到原来那个键值对了。否则,equals()无效。不相等的对象的hashCode()的结果可以相等。
2023-09-21 11:51:22 298
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人