自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 「Endless Embrace」

今年的520,用一首特殊的歌,纪念不久前先后故去的外祖父母。愿他们在天堂安好。愿我们在还来得及的时候,去爱与被爱。I still love you, even though I miss you.2022年7月动画《来自深渊 烈日的黄金乡》片尾曲https://y.qq.com/n/ryqq/songDetail/0001f9ju0jMfW6「Endless Embrace」...

2023-05-20 21:53:46 196

原创 在Ubuntu主机上使用USB无线网卡

前言上个月冲动消费攒了一台华擎DeskMini X300小主机,装了Ubuntu 22.04,用来解决M1芯片MacBook Pro上无法编译x86_64架构的StarRocks和ClickHouse的问题。因为没什么特殊需求所以没用Zen 3的5600G / 5700G当时图便宜买了不带无线网卡的版本(书房有网线,并且自带的AC3168比较emm)。但是最近想把它拿到卧室使用,又...

2023-04-17 02:02:55 4665 4

原创 常用限流算法

时间窗口、漏斗算法、令牌桶算法

2023-02-10 14:08:19 220

原创 反射获取泛型类型

运行时,使用反射获取泛型类型

2022-06-08 16:58:52 199

原创 Java中CAS操作

一个线程获取值为a,另一个线程将数值由a改成了b,接着又改成了a,此时线程b的CAS操作认为是没有变化,但其实已经变化过了,这种过程就叫ABA问题。

2022-03-29 16:08:41 2083

原创 Springboot统一给redisKey加前缀

@Slf4j@Order@Configurationpublic class PreKeyRedisConfig { public static final String DEFUAL_PREFIX = "XXX##"; @Autowired private StringRedisTemplate stringRedisTemplate; @Autowired private RedisTemplate redisTemplate; class Pre

2022-03-28 17:30:59 3308

原创 解决InheritableThreadLocal线程池复用线程时,取值错误

解决InheritableThreadLocal线程池复用线程时,取值错误

2022-03-22 11:19:15 2769

原创 自定义WebMvcConfigurer、WebMvcConfigurationSupport失效之谜

注解-@EnableWebMVC源码@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Documented@Import(DelegatingWebMvcConfiguration.class)public @interface EnableWebMvc {}意思就是说:如果引用了@EnableWebMVC注解,就会往spring容器中注入了一个DelegatingWebMvcConfiguration来统一管理所有的

2022-03-16 23:22:18 3809

原创 时区问题解决

1、我们设置mysql连接,在连接语句后面加上&serverTimezone=GMT+82、然后修改jackson配置#springspring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+83、修改启动类在启动类中,添加这个方法 /** * 设置时区 */ @PostConstruct void setDefaultTimezone() {

2022-03-10 23:47:40 647

原创 Mysql核心内容

MySQL日志类型:binlog:自带的二进制数据redolog:缓存也日志undolog:事务日志MySQL,innodb可重复读的实现原理就是使用使用了mvcc多版本控制,就是同一份数据同时保留多版本的一种方式,进而实现并发控制innodb引擎中,表的隐藏列db_row_id(rowid):长度6byte,隐藏的自增id,如果表没有主键m,innodb会自动以db_row_id产生一个聚族索引db_trx_id:长度byte,最近修改(insert / update)的事务iddb_r

2022-01-06 10:53:33 825

原创 Java对象内存布局 & 对象头Monitor

Java对象内存布局对象头Monitor监听器

2022-01-05 22:48:14 861

原创 可靠传输的工作原理(一篇讲完TCP可用性)

一、前言因为在TCP发送的报文段是交给 IP层(可以理解为网络层)传送的。但是IP层只能提供最大努力服务,就是并不能保证传输的可靠(错误、丢包)。所以我们可以使用一些可靠传输协议,来处理出错、丢失、慢回复等问题。可靠的传输协议包含:停止等待协议连续ARQ协议选择重传ARQ二、停止等待协议就是每发送完一个分组就停止放松,等待对方的确认,在收到确认后在发送下一个分组。工作原理这种方式简单来说就是 发送方A发一个,接收方B接一个并且给A应答,但是传输过程会有这几种情况:A发M1给B,B

2021-12-21 16:09:58 2842

转载 linux文件删除正在读写的文件

背景知识多进程环境下,打开同一个文件,进行读写操作过程中,如果其中一个进程删除这个文件,那么,另外正在读写这个文件会发生什么呢?因为文件被删除了,正在读写的进程发生异常?正在读写的进程仍然正常读写,好像没有发现发生了什么?Linux 是通过 link 的数量来控制文件删除,只有当一个文件不存在任何 link 的时候,这个文件才会被删除。每个文件都有 2 个 link 计数器 —— i_count 和 i_nlink。i_count 的意义是当前使用者的数量,i_nlink 的意义是介质连接的数

2021-12-16 10:40:56 1184

原创 树的按层遍历

给定一个二叉树,需要按层来输出各个节点。

2021-12-16 09:55:11 885

原创 网络协议汇总与终极详细解析

OSI七层协议 比较完整,但是既复杂又不实用。TCP/IP协议 则不同,他现在已经得到了非常广泛的应用。五层协议 采用折中的的办法,既简介又能将概念阐述清楚。参考:通过“表白”,让我们快速了解网络七层协议OSI层功能协议应用层文本传输,电子邮件,文件服务,虚拟终端FTP,HTTP,SNMP,DNS等表示层数据格式化,代码转换,数据加密没有协议会话层解除或建立与其他节点的联系没有协议传输层提供端对端的接口TCP,UDP网络层为数据包选择.

2021-12-15 17:48:37 3093

原创 volatile的底层实现原理

是使用了lock锁汇编指令实现,让副本数据主动刷新主内存数据,从而实现缓存数据一致性问题对于老式的CPU,LOCK执行会阻塞CPU读取共享变量,对于新式的CPU会采用MESI协议CPU 中的 MESI 缓存一致性协议MESI分别代表缓存行数据所处的四种状态(使用额外的两位(bit)表示),通过对这四种状态的切换,来达到对缓存数据进行管理的目的:状态描述监听M 修改(Modify)该缓存行有效,数据被修改了,和内存中的数据不一致,数据只存在于本缓存行中缓存行必须时刻监听所有.

2021-12-15 11:52:44 631

原创 Java内存模型(Java Memory Model,JMM)

定义JMM主要是为了规定了线程和内存之间的一些关系。根据JMM的设计,系统存在一个主内存(Main Memory),Java中所有变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Working Memory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作都是在工作内存中进行,线程之间无法相互直接访问,变量传递均需要通过主存完成。JMM模型下的线程间通信lock(锁定):作用于主内存的变量,把一个变量标识为一条线程独占状态。unlock(解锁):作用于主内存

2021-12-14 11:12:01 672

转载 Redis中ZSET的底层数据结构

https://www.cnblogs.com/wuyizuokan/p/11108417.htmlZSet数据结构类似于Set结构,只是ZSet结构中,每个元素都会有一个分值,然后所有元素按照分值的大小进行排列,相当于是一个进行了排序的链表。如果ZSet是一个链表,而且内部元素是有序的,在进行元素插入和删除,以及查询的时候,就必须要遍历链表才行,时间复杂度就达到了O(n),这个在以单线程处理的Redis中是不能接受的。所以ZSet采用了一种跳跃表的实现。这个实现有点类似于Kafka存储消息是使用的稀疏

2021-12-02 14:57:21 4405

转载 4种常用线程池介绍

文章目录一. 线程池简介线程池的概念:线程池的工作机制使用线程池的原因:二. 四种常见的线程池详解线程池的返回值ExecutorService简介:具体的4种常用的线程池实现如下:(返回值都是ExecutorService)Executors.newCacheThreadPool()Executors.newFixedThreadPool(int n)Executors.newScheduledThreadPool(int n)Executors.newSingleThreadExecutor()!!核心线

2021-12-01 15:19:05 592

原创 Redis的基本类型、实战

数据类型string(字符串)hash(哈希)list(列表)set(集合)zset(sorted set:有序集合)使用场景1. string(字符串)可以用于保存对象、图像、字符2. hash(哈希)存储用户、对象信息(可针对字段进行更新)存购物车,key存商品id,value存数量3. list(列表)双向链表的结构,默认插入的方式是头插法(也可尾插),获得元素的是从头开始遍历到尾4. set(集合)可算两集合交集(利用redisTemplate.opsForS

2021-11-29 12:38:50 557

原创 JVM深入分析——类加载器

一、ClassLoader(类加载器)作用类加载器负责加载 Java 类的字节代码到 Java 虚拟机中。二、类加载过程类从.java文件到实际加载到内存,到使用流程如图:1. 功能1.1. 加载(装载)查找并加载类的二进制数据1.2. 链接链接又分为三个步骤:验证:确保被加载类的正确性准备:为类的静态变量分配内存,并将其初始化为默认值解析:把类中的符号引用转换为直接引用1.3. 初始化为类的静态变量赋予正确的初始值类什么时候才被初始化?创建类的实例,也就是new一个对

2021-11-23 13:45:11 318

原创 JVM了解——类加载器

1. 案例SuperA代码如下:package com.junna.clazz;public class SuperA { static InnerB b = new InnerB(); static { System.out.println("SuperA"); } static class InnerB{ static { System.out.println("InnerBInnerBInnerB"); } public InnerB() { Syste

2021-11-18 09:40:25 77

原创 Spring容器 之 循环依赖终极讲解

一、问题重现情况一SelfDependencyBean 中含有 SelfDependencyBean 属性并且需要依赖注入。情况二OrderServiceImpl 中含有 UserServiceImpl 属性并且需要依赖注入;UserServiceImpl 中含有 OrderServiceImpl 属性并且需要依赖注入。反正嘛,就是形成了循环的依赖关系就是这个意思。如果单例的情况,Spring会自动帮你解决;而多例的情况,从逻辑上是会造成无限递归导致内存溢出,所以spring并不会帮你擦屁股

2021-11-12 15:43:06 1166 1

原创 RabbitMQ相关知识

常见问题如何保证RabbitMQ消息不丢失生产者在投递消息时,开启消息确认机制,确保成功投递到MQ服务器消费者在消费消息时,开启手动ACK机制,确保成功通知MQ服务器删除消息MQ服务器开启消息持久化机制,保证消息确认机制 原理?如何保证消息顺序消费?如何解决消息堆积的情况...

2021-11-04 16:55:56 864

原创 服务、客户端简单Netty demo

maven依赖 <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.42.Final</version> </dependency> <dependency>

2021-11-03 10:15:03 543

原创 synchronized关键字的底层原理

synchronized 底层实现原理synchronized 是由一对 monitorenter/monitorexit 指令实现的,monitor 对象是同步的基本实现单元。在 Java 6 之前,monitor 的实现完全是依靠操作系统内部的互斥锁,因为需要进行用户态到内核态的切换,所以同步操作是一个无差别的重量级操作,性能也很低。但在 Java 6 的时候,Java 虚拟机 对此进行了大刀阔斧地改进,提供了三种不同的 monitor 实现,也就是常说的三种不同的锁:偏向锁(Biased Locki

2021-10-14 11:50:08 118

转载 AtomicInteger底层实现原理

典型回答AtomicInteger是对int类型的一个封装,提供原子性的访问和更新操作,其原子性操作的实现是基于CAS(compare-and-swap)技术。所谓CAS,表现为一组指令,当利用CAS执行试图进行一些更新操作时。会首先比较当前数值,如果数值未变,代表没有其它线程进行并发修改,则成功更新。如果数值改变,则可能出现不同的选择,要么进行重试,要么就返回是否成功。也就是所谓的“乐观锁”。从AtomicInteger的内部属性可以看出,它依赖于Unsafe提供的一些底层能力,进行底层操作;以vo

2021-10-14 11:14:03 483

转载 操作系统中锁的原理

概述为了保证数据的一致性,在多线程编程中我们会用到锁,使得在某一时间点,只有一个线程进入临界区代码。虽然不同的语言可能会提供不同的锁接口,但是底层调用的都是操作系统的提供的锁,不同的高级语言只是在操作系统的锁机制基础上进行了些封装而已,要真正理解锁,还是得看操作系统是怎么实现锁的。锁的本质所谓的锁,本质上只是内存中的一个整形数,不同的数值表示不同的状态,比如1表示空闲状态和加锁状态。加锁时,判断锁是否空闲,如果空闲,修改为加锁状态,返回成功,如果已经上锁,返回失败,解锁时,就把锁状态修改为空闲状态。

2021-10-14 10:36:52 1064

转载 linux的零拷贝(zero copy)

linux的零拷贝

2021-10-12 09:43:22 1278

转载 IO 多路复用

作者:小林coding链接:https://www.zhihu.com/question/32163005/answer/1802684879来源:知乎如果直接抛出多路复用的概念,或许会一脸懵逼,这次,我们以最简单 socket 网络模型,然后带着「如何服务更多的用户」的思考,一步一步的过度到 I/O 多路复用,到后面你就会突然弄懂了这个概念!好了,发车!最基本的 Socket 模型要想客户端和服务器能在网络中通信,那必须得使用 Socket 编程,它是进程间通信里比较特别的方式,特别之处在于它

2021-10-11 15:24:50 142

原创 Java的IO流处理——简单总结知识点

举例读取文件内文本Demo1 public static void readFileByLine(String fileName) { File file = new File(fileName); InputStreamReader reader = null; BufferedReader bfreader = null; try { reader = new InputStreamReader(new .

2021-10-08 16:29:55 175

转载 Spring Bean 生命周期(转)

前言本篇文章主要是要介绍如何在Spring IoC 容器中 如何管理Spring Bean生命周期。在应用开发中,常常需要执行一些特定的初始化工作,这些工作都是相对比较固定的,比如建立数据库连接,打开网络连接等,同时,在结束服务时,也有一些相对固定的销毁工作需要执行。为了便于这些工作的设计,Spring IoC容器提供了相关的功能,可以让应用定制Bean的初始化和销毁过程。Spring Bean 生命周期图片描述先来看看 Spring Bean 的生命周期流程图。结合图看后面的描述会更轻松一点哦。

2021-09-29 10:51:51 88

转载 RocketMQ使用API demo

样例目录1 基本样例1.1 加入依赖:1.2 消息发送1、Producer端发送同步消息2、发送异步消息3、单向发送消息1.3 消费消息2 顺序消息样例2.1 顺序消息生产2.2 顺序消费消息3 延时消息样例3.1 启动消费者等待传入订阅消息3.2 发送延时消息3.3 验证3.4 延时消息的使用场景3.5 延时消息的使用限制4 批量消息样例4.1 发送批量消息4.2 消息列表分割5 过滤消息样例5.1 基本语法5.2 使用样

2021-08-18 09:52:51 360

原创 Springboot实现服务启动后执行

CommandLineRunner作用需要实现在服务启动后执行的功能,SpringBoot提供的一种简单的实现方案就是实现CommandLineRunner接口,实现功能的代码放在实现的run方法中栗子SpringBoot在项目启动后会遍历所有实现CommandLineRunner的实体类并执行run方法,如果需要按照一定的顺序去执行,那么就需要在实体类上使用一个@Order注解(或者实现Order接口)来表明顺序;执行优先级是按value值从小到大顺序。package org.spring

2021-08-16 16:24:29 396

转载 RocketMQ安装

运维管理1 集群搭建1.1 单Master模式这种方式风险较大,一旦Broker重启或者宕机时,会导致整个服务不可用。不建议线上环境使用,可以用于本地测试。1)启动 NameServer### 首先启动Name Server$ nohup sh mqnamesrv & ### 验证Name Server 是否启动成功$ tail -f ~/logs/rocketmqlogs/namesrv.logThe Name Server boot success...2)启动 B

2021-08-16 15:38:51 253

转载 各依赖maven版本号官方对照表(2021年7月30日14:54:51)

https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E

2021-07-29 15:46:25 2297

原创 工程项目修改POM版本号

脚本命令mvn versions:set -DnewVersion=1.0-SNAPSHOTmvn versions:set -DnewVersion=1.0-RELEASESmvn versions:update-child-modules

2021-07-15 17:13:09 239

原创 垃圾回收——GC算法

文章目录一、垃圾对象的判定1)可达性分析法2)引用计数法二、垃圾回收算法1)标记-清除(Mark-Sweep)2)复制算法3)标记-整理/标记-压缩(Mark—Compact)4)分代收集算法三、GC收集器新生代收集器1)Serial2)ParNew3)Parallel Scavenge老年代收集器1)Serial Old2)Parallel Old3)CMSG1收集器一、垃圾对象的判定1)可达性分析法过程:从GC Roots开始向下查询,如果一个对象到任何一个GC Root对象都没有一个引用链相连

2021-06-29 11:15:49 126

原创 JVM——内存结构

文章目录运行时数据区线程共享区方法区什么式方法区堆线程独占区虚拟机栈局部变量表操作数栈动态链接方法出口本地方法栈程序计数器运行时数据区线程共享区方法区什么式方法区方法区,也称非堆(Non-Heap),又是一个被线程共享的内存区域。其中主要存储加载的类字节码、class/method/field等元数据对象、static-final常量、static变量、jit编译器编译后的代码等数据。另外,方法区包含了一个特殊的区域“运行时常量池”。加载的类字节码:要使用一个类,首先需要将其字节码加载到J

2021-06-25 11:05:02 139

原创 自定义注解从理论到实战(开箱即用)

一、前言使用目的更加直观优雅复用性高灵活具体场景对象属性的依赖注入使用aop对方法进行代理,实现数据库、日志记录、实现分布式锁等对传入对象参数的属性值进行校验结合观察者模式、发布订阅模式实现消息变化结合策略模式实现多策略处理…二、基础注解说明注解 @Target功能:指明了修饰的这个注解的使用范围,即被描述的注解可以用在哪里。Target类型描述ElementType.TYPE应用于类、接口(包括注解类型)、枚举ElementType.F

2021-06-25 10:33:16 108

空空如也

空空如也

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

TA关注的人

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