自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 深入理解并发之AtomicReference类

通过AtomicReference的源码可知,最终保证原子操作的是unsafe.getAndSetObject(this, valueOffset, newValue)。由于getAndSetObject是native方法,我需要看下JVM中该方法的实现原理。​ 上篇文章主要分享了基本封装类型的原子类,例如 AtomicInteger,AtomicBoolean,AtomicLong等。那么对象的原子操作如何实现?假设,我们现在要对用户进行银行卡转账操作并保证转账的安全性。

2024-06-04 16:16:44 461

原创 深入理解并发之LongAdder、DoubleAdder的实现原理

​ 答案是否定的。那么 @sun.misc.Contended 注解就是将该变量数据强制刷到不同的缓存行中。通过阅读DoubleAdder的代码之后,你会发现DoubleAdder和LongAdder的代码几乎一样,所以两者的原理都是一样的,这里就不对DoubleAdder 的代码一行行注释了,大家自行阅读。那么我们是不是可以思考一下,将int数据进行打散,分成若干个值,分别计算,最好将值进行汇总。​ 根据缓存行的长度,变量不足长度的数据,进行强制填充。

2024-06-04 16:15:51 396

原创 深入理解并发原理之原子类

上文说到,CPU层次,OS层次,都已经解决了并发问题。都是采用了原子操作指令。下面我们通过Java语言的Atomic原子类,看下Java语言是如果做到原子操作的。

2024-05-30 08:51:33 503

原创 深入理解并发问题的产生原因和解决方案

这个时候,进入等待队列,也需要进行竞争(多个线程没有获取成功),所有,需要对队列的tail指针进行加锁,加锁成功,进入阻塞队列,加锁失败,进行自旋,一直能够加锁成功,进入队列。之前加锁成功,执行完代码之后,会唤醒阻塞队列中的线程,让阻塞队列中的线程重新进行标志位加锁,循环往复,直到执行完代码,线程销毁。这些并发问题就能完美解决。上面对控制总线加锁的方案,确实能够解决并发问题,但是又引入另外一个问题,性能问题: 控制总线是整个系统的资源,同一时间只能有一个CPU使用该资源,多核CPU就变得无意义了。

2024-05-30 08:50:52 621

原创 日志打印规范

以上不同级别日志的规范,读者可以根据自己的实际情况,合理选择。以上就是本次分享的所有内容,如有不足,请多多指正。

2024-03-04 10:59:21 371

原创 为什么是MC(Memcached)而不是Redis?

本文主要分享一下MC和redis作为缓存的一些比较,希望读者能够通过对比,了解二者的区别,能够在适合的场景中使用。以上就是本次分享的所有内容,主要讲述一下Redis和MC的一些对比和相关的实践。如有不足,请多多指正。

2024-02-21 14:24:50 604

原创 响应式编程

​ 响应式编程(Reactive Programming)是一种面向数据流和变化传播的编程范式,其目标是实现高效、可伸缩和响应式的系统。它强调通过触发数据流的变化来实现响应式的系统。在响应式编程中,数据流被视为异步事件序列,通过使用基于事件的操作符来处理和响应这些事件。由事件模型,我们可以想到观察者模式,其实观察者模式也是响应式的一种。有兴趣的读者可以看下响应式宣言响应式宣言: https://www.reactivemanifesto.org/zh-CN。

2024-02-19 11:15:06 510

原创 网络IO模型

本篇博客主要讲解一下网络IO模型。我们常见的网络模型分为 阻塞IO模型,非阻塞IO模型,IO复用模型,信号驱动IO模型,异步IO模型。下面我详细的介绍一下这五个IO模型。前4种IO模型都是同步阻塞IO模型,因为其第二阶段数据报从内核拷贝到用户空间都是同步阻塞的,只是第一阶段等待数据报的处理不同;最后一种IO模型(异步IO模型)才是真正的异步非阻塞IO模型,内核将一切事情都干完。

2024-02-19 10:12:33 950

原创 Redis key命名规范

Redis key命名规范一、实现目标简洁,高效,可维护二、键值设计规约1 Redis key 命名风格**【推荐】**Redis key 命名需具有可读性以及可管理性,不该使用含义不清的 key 以及特别长的 key 名;【强制】以英文字母开头,命名中只能出现小写字母、数字、英文点号 (.) 和英文半角冒号(????;【强制】不要包含特殊字符,如下划线、空格、换行、单双引号以及其他转义字符;2 命名规范【强制】命名规范:业务模块名: 业务逻辑含义: 其他: value 类型1

2024-02-01 20:43:31 968

原创 EasyExcel实现三级联动

项目中需要在导出的模板中新增三级联动的功能,类似省市区的联动。在网上找了一些方法,都不能直接使用,需要进行修改。本文主要分享一下,改后的代码,可以直接使用。以上就是excel实现三级联动的功能实现。当然如果你觉得这么写非常麻烦,也可以将设置好的excel,上传到指定目录下,通过直接下载excel的形式实现该功能。以上就是本次分享的内容,如有不足请多多指正。

2024-02-01 16:10:30 954 2

原创 深入理解MySQL之分区表原理和注意事项

最为糟糕的形式是逐行插入。当然,限制分区的数量也是有效的。答案是你每次查询的数据都是某一个批次的时候就可以用分区,比如说字典,业务的字典和用户类型的字典一般都是存放在同一张表里面的,且你每次查询的时候不是差一个业务或者一个用户类型,而是查询整个业务或者用户类型,这就是一个批次,此时也可以用分区来实现;当更新一条记录时,分区层先打开并锁住所有的底层表,mysql先确定需要更新的记录再哪个分区,然后取出数据并更新,再判断更新后的数据应该再哪个分区,最后对底层表进行写入操作,并对源数据所在的底层表进行删除操作。

2024-01-19 11:27:48 1326

原创 深入理解MySQL之分区表

当我们单表数据量比较大的时候,单表查询的IO较大。这个时候,我们是不是可以将表的数据分成多个文件,按照某个条件进行单文件的查询,这样避免了大量的IO操作。通过分而治之的思想,减少IO操作,提升查询效率。本文主要是讲述MySQL中分区表,看MySQL是如何实现分区表的。

2024-01-19 11:26:13 924

原创 敏捷开发之开发流程

​ 敏捷如果用好了,真的可以提高产研效率,拥抱变化、快速迭代,但是敏捷也不是万金油,需要满足天时地利人和,条件有些苛刻老板大力支持:这个是一切的前提,比如我们之前是老板大力推广敏捷,全部门就能搞起来,后来老板方向变了,敏捷就不搞了;项目能支持小步迭代:敏捷比较适合探索类的项目、或者是 APP 之类的迭代快的项目,因为需求非常容易变更、任务好拆分;如果是传统项目,需求一开始就定好了,任务也不好拆,你就还是老实用瀑布模型吧;团队成员闭环。

2024-01-18 20:10:14 1286

原创 敏捷开发之团队组成

上篇文章分享了敏捷开发中的Scrum的流程,简单介绍了Scrum的流程和相关概念,其中Scrum的角色有三种分别是 产品负责人,团队负责人,项目执行人员。本文主要对团队中的角色以及其负责的内容,进行详细讲解。

2024-01-17 20:59:30 1074

原创 敏捷开发之Scrum

敏捷开发的实现主要包括 SCRUM、XP(极限编程)、Crystal Methods、FDD(特性驱动开发)等等。同样是敏捷开发,XP 极限编程更侧重于实践,并力求把实践做到极限。敏捷开发并不是简单地追求速度,而是在保证质量的前提下,尽可能地提高开发效率和满足客户需求。,将软件生命周期划分为固定的六个基本活动,并且规定了它们自上而下、相互衔接的次序,如同瀑布流水,逐级下落。以上就是对Scrum流程的简单介绍,后面将会通过团队角色和开发流程进一步讲解敏捷开发。​ 敏捷开发的核心理念是。

2024-01-17 20:40:10 1274

原创 Docker环境安装

CentOS Docker 安装脚本自动安装1: 命令如下curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun也可以通过国内 daocloud 一键安装命令curl -sSL https://get.daocloud.io/docker | sh手动安装1: 首先删除Centos 系统中旧版本的dockersudo yum remove docker \ docker-cl

2024-01-15 20:21:24 454

原创 TCP怎么保证传输过程的可靠性?

校验和发送方在发送数据之前计算校验和,接收方收到数据后同样计算,如果不一致,那么传输有误确认应答,序列号TCP进行传输时数据都进行了编号,每次接收方返回ACK都有确认序列号。超时重试这里是引用连接管理流量控制阻塞控制...

2024-01-15 20:20:41 429

原创 谈⼀谈你对TCPIP四层模型,OSI七层模型的理解

TCP/IP四层模型 对比 OSI七层模型OSI七层模型为了增强通⽤性和兼容性,计算机⽹络都被设计成层次机构,每⼀层都遵守⼀定的规则。因此有了OSI这样⼀个抽象的⽹络通信参考模型,按照这个标准使计算机⽹络系统可以互相连接物理层通过⽹线、光缆等这种物理⽅式将电脑连接起来。传递的数据是⽐特流,0101010100。数据链路层⾸先,把⽐特流封装成数据帧的格式,对0、1进⾏分组。电脑连接起来之后,数据都经过⽹卡来传输,⽽⽹卡上定义了全世界唯⼀的MAC地址。然后再通过⼴播的形式向局域⽹内所有电脑

2024-01-14 16:20:41 489

原创 说说TCP 3次握⼿和4次握手

三次握手过程client端建⽴连接,发送⼀个SYN同步包,发送之后状态变成SYN_SENTserver端收到SYN之后,同意建⽴连接,返回⼀个ACK响应,同时也会给client发送⼀个SYN包,发送完成之后状态变为SYN_RCVDclient端收到server的ACK之后,状态变为ESTABLISHED,返回ACK给server端。server收到之后状态也变为ESTABLISHED,连接建⽴完成。思考: 为什么要3次?2次,4次不⾏吗?​ 因为TCP是双⼯传输模式,不区分客户端和服务端,连

2024-01-14 16:19:46 497 5

原创 New一个对象的过程

new一个对象的整体过程过程解析当虚拟机遇见new关键字时候,实现判断当前类是否已经加载过,如果没有加载过,首先执行类的加载机制,加载完成后再为对象分配空间、初始化等。首先校验当前类是否被加载过,如果没有加载,执行类加载机制加载: 从字节码加载成二进制流的过程验证: 当然加载完成之后,需要校验Class文件是否符合虚拟机规范。准备: 为静态变量 常量赋默认值把常量池中符号引用(以符号描述引用的目标)替换为直接引用的过程静态代码块是绝对线程安全的。只能隐式被java虚拟机在类加载过程中

2024-01-14 16:18:30 377

原创 Lombok简介和常用注解

Lombok简介1:作用简化Pojo(不包含业务逻辑,能够控制自己内部n个属性访问的java对象)类的书写(getter, setter ,toString ,equals, hashcode…)2: 各种POJOdto:data transfer object (前台传输过来的参数)do :data object(表字段一一对应)bo : service处理对象vo : view/value object值对象 对应视图对象3: Lombok注解使用构造函数注解@NoArgsConst

2024-01-11 11:34:34 485

原创 Lombok @Data使用的坑

​ Lombok 是一个很优秀的Java库,简单的几个注解,可以干掉一大片的模版代码。当我们使用的时候,要知其然,也要知其所以然,这样才能避免不必要的坑。

2024-01-11 11:32:49 1013

原创 使用Notepad++将多行数据合并成一行

6、设置好之后,点击“全部替换”,即可将多行数据合并成一行。1、按Ctrl+F,弹出“替换”的窗口;3、“查找目标”内容输入为:\r\n;5、“查找模式”选择为正则表达式;4、“替换为”内容为空;2、选择“替换”菜单;

2024-01-11 10:10:24 3130

原创 Java8新特性之函数式接口

​ 通过使用函数式接口,可以将Lambda表达式作为参数传递给方法,从而简化代码,提高代码的可读性和维护性,当然这种简洁性和可读性是仁者见仁,智者见智的事情。

2024-01-09 16:59:39 1752

原创 深入理解 MyBatis-Plus 批量保存方法

在项目开发中,需要插入批量插入20多万条数据,通过日志观察,发现在调用MyBatis-Plus中的saveBatch()方法性能非常的差,本篇文章主要分享一下saveBatch()的原理以及使用的注意事项1: 想要批量执行操作 数据库链接参数加上rewriteBatchedStatements=true2: 根据doUpdate(ms,parameter). 完成SQL的拼装的原理可以得出,如果批量插入的数据,有些数据字段值为null,不会批量查询,而是单独拼装一个SQL执行。

2024-01-09 14:39:51 6594 2

原创 设计模式-总述

设计模式代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。它是开发人员在软件开发过程中面临的一般问题的解决方案。这些方案是众多软件开发人员经过相当长的一段时间总结出来的。是一套被反复使用的,多数人知晓的,经过分类编目,代码设计经验的总结。提高了代码的复用,让代码容易被他人理解,保证代码可靠性。

2024-01-06 11:13:03 1193 1

原创 设计模式之过滤器模式

目的:使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来;实现:制定不同的规则来对一组对象进行过滤,然后对过滤结果进行分组。

2024-01-06 11:06:35 506

原创 接口性能优化思路

在开发中,项目中经常会出现一些接口响应比较慢的情况,借此,本文主要分享一些接口优化的思路接口效率问题,在开发过程中,除了业务实现,是我们需要关注的地方。站在接口设计者的角度去开发需求,会避免很多这样的问题,提高开发效率。

2024-01-05 10:53:20 974

原创 Spring和Spring Boot的区别

最后,Spring Boot是基于Spring框架的,因此它的底层实现和Spring是一样的。总之,Spring和Spring Boot都是非常优秀的Java开发框架,它们各自有着不同的特点和优势。如果你需要更多的灵活性和控制权,那么Spring可能更适合你。首先,Spring是一个轻量级的控制反转(IoC)和面向切面编程(AOP)框架,它提供了丰富的功能和灵活的配置选项。而Spring Boot则是一个基于Spring框架的快速应用程序开发框架,它的目标是让开发者能够更加便捷、高效地构建应用程序。

2024-01-04 22:21:40 724

原创 设计模式之桥接模式

定义: 将抽象部分与它的实现部分分离,使他们都可以独立地变化。看下UML结构图:其中Abstraction为抽象化角色,定义出该角色的行为,同时保存一个对实例化角色的引用。implementor 是实例化角色,它是接口或者抽象类,定义角色必须的行为和属性。RefinedAbstraction 为修正抽象化角色,引用实例化角色对抽象化角色进行修改。ConcreteImplementor,为具体实现化角色,实现接口或抽象类定义的方法或者属性。这段是不是听着很懵,哈哈哈,没错,我也看着很懵。下面我们举个栗子。

2024-01-04 22:09:45 569

原创 常见的数据结构

图是表示一对两个集合的非线性数据结构:G={V, E},其中 V 是顶点(节点)的集合,而 E 是边(箭头)的集合。最小堆是一棵二叉树,其中每个节点的值都大于或等于其父节点的值:val[par[x]] <= val[x],具有堆的 xa 节点,其中val[ x]是它的值,par[x] 是它的父级。二叉搜索树是一棵二叉树,其中节点的值属于一个完全有序的集合——任何任意选择的节点的值都大于左子树中的所有值,而小于右子树中的所有值。哈希表是一种特殊类型的映射。一个顶点的父节点是它上面的事件顶点——它是唯一的。

2024-01-04 21:28:18 1166

原创 数据结构和算法之基础介绍

作为计算机专业最最最基础的课程之一 数据结构和算法, 贯彻在整个计算机体系结构,可见其重要性。因此,本专栏将持续进行分享数据结构和算法,加强基础。

2024-01-01 13:14:38 547

原创 git merge 和git rebase的区别

在实际开发工作中,我们按需使用这两个命令。上面图片是使用两种命令的代码合并的结果。下面是两种结果的对比。

2023-12-31 09:32:42 328

原创 BigDecimal介绍和使用

​ 在工作中,我们在针对金额类字段进行计算的时候,通常使用BigDecimal 类型的字段,来保留金额的精度。因此,本篇文章主要分享一下Java语言中的BigDecimal类的使用,以及使用过程中的坑。​ 在日常的开发工作中,针对有数据精度要求的金额数据,都会使用BigDecimal类型(不排除有些公司使用String类型处理)。BigDecimal是Java在java.math包中提供的线程安全的API类,可以用于表示任意精度数字的类,它可以表示无限长度的小数。

2023-12-30 11:37:20 1051

原创 如何写好述职报告

最近因为转正,准备述职报告,由于第一次这种正式的做PPT汇报,搞得焦头烂额。因此本篇文章主要分享一下, 我做述职报告的过程中的感想, 希望对读者有些帮忙。本文将从PPT前准备,如何做PPT, 如何汇报三方面进行讲述。​ 制作述职报告的核心 ‘谁做了什么事情,思考了什么,获得什么成长,以后怎么做的更好如果我们在工作中能够这么做,那做PPT真是的“张飞吃豆芽,小菜一碟”。PPT能力有可能在一部分人看来是嗤之以鼻的能力,无论你是做技术还是管理,好的PPT能力都能给你的工作如虎添翼。

2023-12-27 22:30:25 363

原创 MySQL之 InnoDB 内存结构

从MySQL 5.5版本开始默认 使用InnoDB作为引擎,它擅长处理事务,具有自动崩溃恢复的特性,在日常开发中使用非常广泛下面是官方的InnoDB引擎架构图,主要分为和两大部分。

2023-12-08 21:22:22 115

原创 Java 8新特性之 Optional 类

java.util.Optional 是java8中引进的一个新的类,我们通过Optional类的源码可以看到,该方法的作用可以对可能缺失的值进行建模,而不是直接将null赋值给变量。上面介绍了Optional类的API方法和常见用法。这些方法是最原始的方法,可以根据自己的业务开发场景,封装适合自己的工具类,方便快速开发。

2023-12-08 21:20:48 27

原创 RESTful API设计与实践

RESTful API即遵循REST原则的API,采用HTTP方法(GET、POST、PUT、DELETE等)对资源进行操作,使得不同平台和语言的客户端可以轻松地与服务器进行交互。本文介绍了RESTful API的概念、优势、应用场景以及常见问题和解决方案。未来,随着技术的不断发展,RESTful API将在更多领域得到广泛应用,为软件开发带来更多的可能性。本文将详细介绍RESTful API的概念、优势、应用场景以及常见问题和解决方案,旨在帮助读者更好地掌握这一技术。二、RESTful API的优势。

2023-12-08 21:18:57 26

原创 深入理解Spring事件监听机制

​ 对于开发者来说,使用 Spring 监听机制非常简单。只需要实现事件和监听器接口,并在代码中注册监听器即可。Spring 会自动管理事件和监听器的生命周期,确保它们的正确运行。同时,由于 Spring 监听器使用了异步执行机制,因此不会影响主线程的运行效率,保证了应用程序的高并发和高效性。

2023-12-08 13:44:47 1025

原创 观察者模式

观察者模式是一种行为设计模式, 允许你定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象是一种行为设计模式, 允许你定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象所谓的观察者模式,就是生产者和消费者这种形式的抽象话。让发布事件的逻辑和消费事件的逻辑解耦合,并且异步化。由此我们是不是联想到了消息队列。没错,当我们跨JVM的时候,就需要这种消息中间件来管理事件。以上就是本次分享的内容,如有不足,请多指教。

2023-12-07 16:29:11 31

MySQL原理和优化实战

MySQL原理和优化实战

2024-02-03

空空如也

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

TA关注的人

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