自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(34)
  • 收藏
  • 关注

原创 SpringBoot工程中测试Groovy代码

测试没有参数的方法(无返回值)测试带入参的方法(无返回值)测试带入参的方法,有返回值。

2024-07-02 17:55:22 221 1

原创 原来这个东西叫 Docker

2013年,dotCloud 做出重大决策,将 Docker 开源,这一举动迅速吸引了全球工程师的目光,他们被 Docker 的高效与便捷所吸引,使其一跃成为最热门的开源项目之一。:借助Docker容器技术,开发者在同一硬件基础设施上能建立多个独立的运行环境,便于并行进行新应用的测试与开发,同时确保现有应用不受干扰,促进了开发和测试的高效协同。简而言之,Docker通过其高效的构建、运输、运行模型,以及轻量级的容器化方案,彻底改变了软件开发和部署的格局,使得开发者能够更加灵活、高效地在不同环境中部署应用。

2024-06-21 17:10:15 599

原创 Centos远程服务器,使用 Docker部署 Nacos

我用的是阿里云,在控制台安全组添加一个8848端口,然后去添加防火墙放行端口,记得重启一下防火墙才能生效。最后,访问服务器 ip:8848/nacos,即可访问到 nacos。首先确保 Docker 已经成功安装,并且正在运行。拉取最新版本的 nacos 镜像。第一步,配置国内的镜像仓库。重启 Docker 服务。单机状态运行 nacos。安全组放行,防火墙放行。

2024-06-21 15:56:17 245

原创 自学Java到找工作,最强学习路线,2024年最新版

第一次学,了解是这么一回事,知道前后端是如何交互的,遇到问题,能够通过百度解决,基于解决问题来学习,而不是总想把他们都记住。可以跟着B站的代码随想录,课程是免费的,而且手写代码,可以一路跟下去,到后面有点难度,如果实在感觉学不下去,可以先放一放,学路线后面的部分。我自己用的是一个小程序,里面都是大佬自己手写的答案,题目的命中率超高,可以省下非常多的时间,一下子解决自己找答案的痛苦。本人是2024届的毕业生,自学Java的路上,也踩了不少的坑,希望在这里给小伙伴一些帮助,避免无效学习,一起进大厂!

2024-06-14 09:32:46 428

原创 以为自己已经很快了 —— 聊聊AtomicLong

大家好,我是徒手敲代码。之前在聊过,多线程环境下对共享变量进行修改操作,如果不想加锁,可以用 CAS,采用自旋的方式来避免加锁带来严重的性能损耗。Java 当中针对 CAS 的思想,设计了几个原子类,其中就包括AtomicLong这个类最常见的应用场景,包括计数器、序列生成器,以及需要在高并发环境下进行原子性更新长整型变量的场景。例如,在分布式系统中,它常被用来实现全局唯一ID的生成,或是统计服务的请求数量、成功响应次数等指标,确保在多线程或多进程访问时数据的准确性和一致性。

2024-06-06 16:31:10 305

原创 计算机网络五层模型,看不懂请你去吃宵夜

想象城市中的邮局系统,传输层就像是邮递服务,它不仅负责将信件(数据)从一个城市(主机)的邮局准确投递到另一个城市(主机)的邮局,还进一步确保信件能精确送达收件人的家中(特定应用程序)。应用层就是处理这些“阅读指南”的,它定义了各种数据的格式和规则,比如 HTTP 定义网页数据格式,SMTP 管理电子邮件的发送,让最终用户能够理解和使用接收到的信息。计算机网络的五层模型自底向上分别为物理层、数据链路层、网络层、传输层和应用层,每一层都承担着特定的职责,共同确保数据在网络中的传输和最终呈现。

2024-06-06 12:28:05 243

原创 原来这叫读写锁 —— ReentrantReadWriteLock

大家好,我是徒手敲代码。今天来介绍一下包下的顾名思义,它是读写锁的一种,同一时间,读操作可以有多个线程,但是写操作只能有一个线程,并且读和写不能同时进行;读锁被占用,那么写锁就不能获取,反过来也一样。之前学过的互斥锁,比如,在任何时候都只允许一个线程访问共享资源,这在读操作远多于写操作的场景下,显得效率很低,因为即使多个读操作之间并不冲突,它们也必须排队等待。的诞生,正好可以解决这个问题。它通过分离读锁和写锁,使得并发读成为可能。下面通过阅读源码的方式,来看看大佬是如何设计这个读写锁的。

2024-06-01 17:28:33 260

原创 既然选择了吞吐量,谈何公平 —— ReentrantLock

大家好,我是徒手敲代码。今天来介绍一下 ReentrantLock它属于包下的一个类,是一种可重入的互斥锁,允许同一个线程多次获取同一把锁而不会导致死锁。与相比,ReentrantLock 允许尝试非阻塞地获取锁、支持锁的超时获取以及在等待锁时可被中断。另外,ReentrantLock 可以通过构造函数参数指定锁的获取是否公平,而总是采用非公平策略。需要注意,Reentrantlock 不会像那样,在出现异常或者线程结束时自动释放锁,所以我们需要在finaly块中手动 释放锁,以避免发生死锁。

2024-05-31 16:33:02 335

原创 区区死锁,何足挂齿

在程序执行的过程中,两个或以上的线程,因争夺有限资源而彼此陷入等待,没有人愿意先作出让步,进而导致所有相关线程都无法继续推进。举个例子,教室里的两个人,A 和 B,A 手上拿着两支笔,B 手上拿着两张试卷。每个人都必须同时拥有笔和试卷,才能写作业。但是双方都不肯先让步,A 要求 B 先给出试卷,而 B 要求 A 先给出笔,那么最后的结果,只能是两个人一直互相消耗。

2024-05-30 20:40:21 270

原创 小小字符串竟然如此嚣张 —— 聊聊 Java 的 String

大家好,我是徒手敲代码。今天来分享几个 String 在面试当中,比较常见的问题。这个东西用得最多,而且底层的原理,面试也经常问。

2024-05-25 15:56:40 452

原创 双非本科,逆袭中大厂的 Java 学习路线

最强Java学习路线

2024-05-24 17:33:58 823

原创 私人地方,禁止闯入!—— ThreadLocal

通俗一点,假设商场的客人就是一个个的线程,那么放在储物柜的东西,就是每个线程各自的资源。它允许每个线程拥有各自独立的变量副本,即使变量名相同,不同线程之间的变量值也不会相互影响。多线程环境下,帮助每个线程维持独有的任务执行环境,或者上下文信息,比如用户会话、事务 id 等等。既然是每个线程都保存一份,那么如果线程数一旦多了起来,或者保存的数据占用空间很大,而且用完之后没有及时释放,肯定会造成严重的。内存泄漏主要是因为用完的对象没有被及时地进行垃圾回收,那么我们在使用它的过程中,一旦这个。

2024-05-21 21:06:07 127

原创 加锁过于残暴?不妨试试CAS

大家好,我是徒手敲代码。今天来介绍一下CAS。这个东西的全名是 Compare and Swap,比较并交换。在修改数据之前,先比较指定内存位置上的值,看是否相等,如果相等,就用新的值替换旧值,如果不相等,那么就直接返回。

2024-05-20 16:46:08 281

原创 腾讯后端一面:说说你对两阶段提交的理解

大家好,我是徒手敲代码。在分布式系统当中,确保数据的一致性是一项至关重要的任务。作为分布式事务处理的核心机制之一,它主要用于解决分布式环境中多个节点间的数据同步和一致性问题,确保事务的原子性——即事务中的所有操作要么全部成功,要么全部失败。这个机制的两个阶段,指的是准备阶段和提交/回滚阶段。准备阶段在这个阶段,系统中的一个协调者组件,会扮演着指挥官的角色,它向所有涉及事务的参与者发送请求。每个参与者接收到请求后,会进行一系列的检查,比如确保本地资源能够满足事务提交的需求。

2024-05-18 16:29:47 276

原创 是谁,又被分布式锁给锁住了?(下)

但是一般在使用 Redis 的时候,都会采用主从集群 + 哨兵的方式去部署,这样做可以保证 Redis 服务的高可用,即使主节点挂了,也可以在从节点里面再选一个出来,作为主节点。举个例子,客户端在某个 Redis 实例加锁成功,但是因为网络问题,一直没有返回成功的信息,导致客户端误认为这个实例加锁失败,如果最后这个锁没有被释放,那么锁将一直残留在这个 Redis 实例当中。的值是否小于锁的过期时间,也就是判断,在后面的实例成功加锁之后,前面加的锁有没有过期,如果没过期,那么就认为加锁成功。

2024-05-16 15:56:04 322

原创 返校后的一些杂想

比如不喜欢调休,不喜欢连着放n多天的假之后,要连上n多天的班,老是希望所谓的“专家”,可以制定一些稍微人性化的政策,那结果只能是无休止的希望,而这个希望,可能永远都不会实现。可能这是人生最后的机会,在校园里面生活了,往后的余生,就只剩校园的回忆。最近一段日子,我会尽可能多参加一些校园活动,比如打篮球、英语活动、草地音乐会之类的,让校园氛围熏陶一下自己的内心。似乎随着年龄的不断增长,可以让自己心跳加速的事物和人,无论是兴奋激动,或者是紧张,都变得越来越少了。然后在教室,八点呆到将近十二点,答辩完成,吃饭。

2024-05-15 17:30:41 335

原创 是谁,又被分布式锁给锁住了?(上)

大家好,我是徒手敲代码。今天来介绍一下分布式锁。首先思考下这些问题:为什么需要分布式锁?基于 Redis 如何实现分布式锁?单纯使用setNx命令来加锁,会存在什么问题?经常听到的RedLock,是百分百完美的方案吗?除了 Redis,还有其他的解决方案吗?因为篇幅问题,本文主要解决前三个问题。

2024-05-14 14:44:02 721 1

原创 分布式系统的妥协——Base定理

大家好,我是徒手敲代码。上篇文章中,我们介绍了CAP定理,也知道在分布式系统当中,三个特性只能同时满足两个:分区容错性 + 一致性或可用性。想要一致性,就必须舍弃可用性,反之亦然。想象一下,当我们在网上购物的时候,希望看到的库存数量总是准确无误,这是一致性;而无论何时点击购买都能顺利完成交易,这是可用性。那么如何满足如此苛刻的要求呢?对此,大佬们提出了一个叫做的东西,这是一个更加实际的解决方案。它代表了三个原则:基本可用(Basically Available)软状态(Soft State)

2024-05-12 21:04:41 415 1

原创 分布式系统的起点——CAP定理

大家好,我是徒手敲代码。写完设计模式之后,就断更了将近两个星期。可能是一直下雨,湿气太重的原因,睡眠质量不太好,导致精神状态也比较低迷。(总要找个借口推脱一下)接下来会更新专题相关的文章,发表自己的一些见解,如果有错误的地方,欢迎各位指出。所谓的分布式系统,就是多个节点分工合作,就算某一个节点挂了,也只会影响其中的一些服务,而不至于成个系统都崩溃。此外,在遇到性能瓶颈的时候,还可以比较容易的做出扩展,比如增加更多的节点,而不至于要重构整个系统。

2024-05-11 15:10:24 783 1

原创 Seata本地部署,最通俗易懂的教程!

1、seata 下的 config,这里我用的是 nacos。注意 namespace (命名空间)这个配置项,填的是命名空间自动生成的 key,别填了名字上去。官网说用命令行的方式,是在Linux系统上,如果windows本地,直接点开就好了,不然会报什么数据库类无法创建的错。的配置文件如下:建议新手可以直接用,改一下数据库密码和命名空间就可以了,不然看懵。2、seata 下的 registry,这里我用的是 nacos。注意,上面两个才是打包好的文件,下面两个是源代码。上显示有服务,就是没问题了。

2024-05-09 18:55:23 241 1

原创 不问过程,只求结果 —— 工厂模式

但是如果这个对象在初始化的时候,需要执行一些其他的逻辑,比如:查询数据库、读取配置文件等,那么对象的构造函数,将会变得非常复杂。那么,如果业务还需要继续拓展,除了汉堡之外,还有煲仔饭、披萨等其他的类,那么要继续创建一堆的工厂类吗?工厂模式的核心思想,就是让客户端在创建对象的时候,不需要关注具体的初始化细节,直接拿来就用。此时,可以引入一个汉堡包的工厂类,负责创建汉堡包对象,将n多行的初始化代码,移到这里。像这样,一个类对应着一个工厂类,利用多态的特性去创建对象的模式,就是工厂方法模式。

2024-04-27 10:20:05 355

原创 每个变化过后,都有观察者在如影随形——观察者模式

大家好,我是徒手敲代码。今天来介绍一下观察者模式。想象一个场景,小明关注了一个公众号,当公众号更新推文时,小明会收到通知。此时,小明可以选择是否查看这些更新的推文,而不用主动点开这个公众号的主页,才知道他有没有更新。观察者模式总共有两个东西,一个是观察者,一个是被观察者。上述场景中,小明是观察者,而公众号是被观察者。而公众号有多个粉丝,相应的,被观察者需要维护一个观察者的列表,当被观察者的状态发生变化时,会自动通知这些观察者,使得观察者做出动作。

2024-04-26 09:03:35 269 1

原创 继承与组合的爱恨情仇 —— 装饰者模式

介绍装饰者模式的来龙去脉

2024-04-18 09:07:24 126 1

原创 专业的事情,交给专业的人去干,你只管好好上班 —— 代理模式

大家好,我是徒手敲代码。今天来介绍一下代理模式。在日常生活中,当需要完成一项专业性强、涉及复杂流程的任务时,比如:买房,我们会选择委托给专业人士——房地产中介。这个扮演的就是代理角色。他凭借专业知识,帮我们处理各种细节,确保任务顺利完成。但是如果我们省去这些代理,直接与多方交涉,可能会面临信息不对称、流程不熟等问题。像这种专业的事情,交给专业的人去做的原则,就相当于软件范畴中的代理模式。假设有一个接口,定义了新增用户和更新用户的方法。实现类,实现了这个接口。如果我们需要在调用和。

2024-04-17 19:00:21 255

原创 你管这叫单例模式?

介绍一下单例模式,以及常见的写法

2024-04-16 12:35:09 927

原创 “我的语言极限,即是我的世界的极限。” ——《On Java》书籍推荐

推荐一本Java书籍《On Java》,文末有免费领取方式

2024-04-14 12:47:46 232 1

原创 坚持写作的第一周 —— 躺平和内卷之间反复横跳

分享坚持写作第一周的心得

2024-04-13 15:37:48 529

原创 不吃饭也要搞定的 —— synchronized

理科思维看待 synchronized 的锁升级过程,避免死记硬背

2024-04-13 09:57:38 1202

原创 这么来理解volatile,稳拿offer!

大家好,我是徒手敲代码,今天来分享一下 volatile 这个关键字。本文将多线程场景,比喻成在饭店里,服务员上菜,以及修改菜单的场景,将抽象的东西实例化。在计算机中,CPU 是一个饭店老板,它有多个服务员(线程),而内存则是一本巨大的菜单,记载着各种菜肴(数据)。为了提高效率,CPU还为每个服务员配备了私人备忘录(高速缓存),让他们快速和菜单信息。然而,这种看似牛逼的机制,却悄悄埋下了线程不安全的隐患。

2024-04-11 19:25:12 724 1

原创 HashMap的十个连环追问,阁下又该如何应对?

介绍一下HashMap在面试中最常考的十道题

2024-04-11 09:08:28 881 1

原创 数据库索引,这么来理解!

索引,可以类比成书的目录,通过直接翻书的形式,来找某个章节的话,可能会很慢,但是如果看了目录再翻,就会快很多。索引在数据库中的应用也是类似这样。索引是建立在某个字段之上的,建了索引之后,在查询的时候,将这个字段作为查询条件,就可以快速定位到目标信息的位置,大大减少查询时间。在这条 sql 中,查询年龄为 20 的用户,如果在 age 字段上建立了索引,那么将会大大提升查询效率。注意,是在查询条件的字段建索引,也就是 where 后面,才能发挥作用。那是不是就意味着,我们可以无脑的创建索引呢?当然不是。

2024-04-10 15:04:41 682

原创 Java反射,这么来理解!

介绍一下反射

2024-04-10 15:02:33 287 1

原创 Java异常,最通俗的理解!

大家好,我是徒手敲代码。今天分享面试中,常见的几个异常问题。在看面试题之前,首先要问问自己,究竟什么是异常,怎么理解异常呢?从字面上看,异常就是的意思。如何定义不正常呢?做饭之前,买好了苦瓜,买好了牛肉,本来想做个番茄炒蛋。结果家里停电停水,天意弄人。像这些意外情况,让我们无法继续把做饭这个动作进行下去,只能停下来,解决了停电停水这个问题,才能继续,这就是异常。回到编码上,当我们运行Java程序的时候,JVM会按照字节码,一行一行地运行下去,注意不一定按照我们写的顺序来的喔(这和万恶的编译器有关)。

2024-04-10 15:00:28 911 1

原创 看懂这些Java基础,面试妥妥的

分享几个Java的基础面试题

2024-04-10 14:57:21 592 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除