自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Future、CompletionService、CompletableFuture介绍与对比

Future是JDK1.5 提供的接口,是用来以阻塞的方式获取线程异步执行完的结果。FutureTask 类是 Java 中 Future 接口的一个实现,同时也实现了 Runnable 接口。它用于表示异步计算的结果,允许一个任务在一个线程中计算结果,在另一个线程中获取计算的结果。// 创建一个固定大小的线程池 ExecutorService executorService = Executors . newFixedThreadPool(2);

2024-01-04 18:58:23 1259 3

原创 用Java实现Huffman编码

在使用http1.1协议传输数据的时候,会有一些固定的字段,比如cookie、编码方式、接收的数据类型,另外会有一些大量重复的字段造成请求报文过于冗长,为了解决这个问题,在http2.0的时候,采用了二进制对请求报文进行编码,同时客户端和服务端维护一张静态表和静态表,对我们的请求报文进行二进制编码,同时采用Huffman编码进行压缩。

2023-08-30 00:05:47 507

原创 Kafka学习笔记

另外,为了保证新的 Producer 启动后,旧的具有相同Transaction ID的 Producer 即失效,每次 Producer 通过Transaction ID拿到 PID 的同时,还会获取一个单调递增的 epoch。Producer 的幂等性指的是当发送同一条消息时,数据在 Server 端只会被持久化一次,数据不丟不重,Kafka为了实现幂等性,在0.11.0.0之后加入的该新功能,它在底层设计架构中引入了ProducerID和SequenceNumber。副本是在分区这个层级定义的。

2023-08-27 22:46:31 843

原创 谈谈项目中的策略模式

前端为我们提供一个策略选择,比如“分配”,那么在传过来的body中便会带上“assign”这个,根据此我们可以在后端中找到对应的实现,关于字符串到具体实现类的映射我们可以用一个map保存。在上面我分享的文章当中,作者提到一种方案采用static静态代码块,个人认为这种方案的缺陷,如果我新增了一个策略实现,那么我还得在静态代码块中添加相应映射,同时作者还提供了交由spring创建的方式。在策略模式中,我们为这些方法提供了统一的入口,根绝前端传过来的策略枚举,我们能够去找到对应的策略实现。

2023-08-10 10:50:01 186

原创 Dubbo中的负载均衡策略

在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为 weighted random 基于权重的随机负载均衡策略。具体实现上,Dubbo 提供的是客户端负载均衡,即由 Consumer 通过负载均衡算法得出需要将请求提交到哪个 Provider 实例。

2023-08-02 15:22:04 198

转载 Zookeeper-Zab协议

ZAB协议用来保持数据一致性,主要有两种模式,第一是消息广播模式;第二是崩溃恢复模式除此之外我门还应该了解Leader的选出机制。

2023-07-30 20:10:44 77

原创 高并发下的计数——LongAdder

高并发下计数,一般最先想到的应该是AtomicLong/AtomicInt,AtomicXX能保证并发情况下计数的准确性,其内部通过CAS来解决并发安全性的问题。当有大量线程同时去更新一个变量,任意一个时间点只有一个线程能够成功,绝大部分的线程在尝试更新失败后,会通过自旋的方式再次进行尝试,这样严重占用了CPU的时间片,进而导致系统性能问题。LongAdder采用分段的方式,通过维护一个基准值base和 Cell 数组降低并发冲突的概率。

2023-03-28 23:11:09 286

原创 Java中Sychronized的锁升级

无锁状态下线程 A 初次执行到synchronized代码块的时候,锁对象变成偏向锁,执行完同步代码块后,线程并不会主动释放偏向锁,后续线程 A 再次访问同步代码时,不需要做任何的 check,直接执行(偏向于第一个获得它的线程),这样降低了获取锁的代价,提升了效率。无锁、偏向锁的 lock 标志位是一样的,即都是 01,无锁、偏向锁是靠字段 biased_lock 来区分的,0 代表没有使用偏向锁,1 代表启用了偏向锁。后续的竞争线程都会通过自旋来尝试获取锁,如果自旋成功那么锁的状态仍然是轻量级锁。

2023-03-27 18:36:28 316

原创 synchronized与Lock的异同

synchronized与Lock都能进行加锁,不过不同的是Synchronized 是Java的一个关键字,而Lock是java.util.concurrent.Locks 包下的一个接口,底下有不同的实现方式。当方法调用时,调用指令将会检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程将先获取monitor,获取成功之后才能执行方法体,方法执行完后再释放monitor。在 Java 中,静态代码块是在类加载时执行的,而类加载的过程是由类加载器负责的。

2023-03-26 22:08:14 157

原创 线程同步以及多线程通信方式

当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态,这就是线程同步。

2023-03-26 21:43:41 117

原创 springboot的自动装配

通过引入依赖(Starter),从spring.factories文件中获取到对应的需要进行自动装配的类,并生成相应的Bean对象,然后将它们交给spring容器来帮我们进行管理,这就是springboot的自动装配。指定的生效条(Starters提供的依赖、配置或Spring容器中是否存在某个Bean等)时,实例化该AutoConfiguration类中定义的Bean,并注入Spring容器,就可以完成依赖框架的自动配置。注解的入口程序类所在的basepackage下的所有带有。

2023-03-21 00:12:47 415

原创 PageHelper是怎么分页的

PageHelper是mybatis 提供的分页插件,通过就可以帮我们实现分页,目前支持Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库。pom依赖:

2023-03-01 23:55:48 4062

原创 springboot+vue前后端分离跨域问题

同源策略是一种约定,它是浏览器最核心也最基本的安全功能,同源是指"协议+域名+端口"三者相同,比如http://localhost:8080与http://localhost:8181就不是同源。

2023-03-01 00:11:51 1103

原创 springboot整合MinIO实现视频的分片上传/断点续传

之前做了一个慕课网上的仿短视频开发,里面有很多比较粗糙的实现,比如视频上传部分是直接由前端上传云服务,没考虑到客户的网络环境质量等问题,如果一个视频快上传完了,但是网断了没有上传完成需要客户重新上传,这对于用户体验是极差的。那么我们对于视频文件的上传可以采取断点续传,上传过程中,如果出现网络异常或程序崩溃导致文件上传失败时,将从断点记录处继续上传未上传完成的部分,断点续传依赖于MD5和分片上传,对于本demo分片上传的流程如图。

2023-02-28 13:06:30 8862 3

原创 Token和Refresh Token

JWT(JSON Web Token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证;应用场景如用户登录。

2023-02-14 22:27:06 3406

原创 数据库中主键ID的生成方案

数据库表里通常都会有一个主键id,来作为这条数据的唯一标识。主键 一定要做到唯一,mysql数据库提供的自增主键可以作为主键ID,UUID全球唯一的特性也是一个方案,那究竟应该选哪种方案,每种方案的优劣又是什么?

2023-02-14 16:57:40 2171

原创 springboot对参数进行校验

如何按照自定的规则进行校验?自定义注解@Target({TelephoneNumberValidator . class }) // 指定校验器 public @interface TelephoneNumber {Class

2023-02-13 17:02:05 916

原创 Spring MVC的异常处理

使用实现HandlerExceptionResolver接口的异常处理器进行异常处理,具有集成简单、有良好的扩展性、对已有代码没有入侵性等优点,同时,在异常处理时能获取导致出现异常的对象,有利于提供更详细的异常处理信息。使用SimpleMappingExceptionResolver进行异常处理,具有集成简单、有良好的扩展性、对已有代码没有入侵性等优点,该方法仅能获取到异常信息,若在出现异常时,对需要获取除异常以外的数据的情况不适用。这里标注的方法优先级最低,只有当其它方法都不适用时,才会来到这里处理。

2023-02-12 17:52:48 392

原创 springboot中的拦截器

拦截器可以在进入请求方法前做一些操作,也可以在请求方法后和渲染视图后做一些事情。拦截器的实现只需要实现 HandlerInterceptor 接口,并进行配置即可。preHandler:进入请求方法之前执行;:请求方法执行完成之后执行;:视图渲染后执行。如果不设定拦截器顺序,preHandle 方法执行顺序与拦截器注册时顺序一致,postHandle 和 afterCompletion 方法执行顺序相反;

2023-02-12 12:43:39 4148

原创 谈谈静态代理和动态代理

}

2023-02-11 23:21:12 224 2

原创 通过request对象获取请求IP

用户的真实IP不能直接使用request.getRemoteAddr(),这是因为可能会使用一些代理软件,这样ip获取就不准确了,此外我们如果使用了多级(LVS/Nginx)反向代理的话,ip需要从X-Forwarded-For中获得第一个非unknown的IP才是用户的有效ip。

2023-02-10 17:32:43 2002

原创 MIT6.830 lab6 一个简单数据库实现

lab4为了保证事务的原子性,我们在事务提交时才对脏页进行写盘,也就是no-steal/force策略no-steal:磁盘上不会存在uncommitted数据force:事务在committed之后必须将所有更新立刻持久化到磁盘在这个lab中,我们要实现的是steal/no-force策略,对于steal策略,如果数据库异常重启,为了保证事务的原子性,我们需要uodo-log来保证数据库crash的时候能够回滚;

2023-02-06 14:24:50 342

原创 MIT6.830 lab5 一个简单数据库实现

这次的lab是实现B+树索引,BTreeFile 由四种不同的页面组成。和;此外还有头部节点页面用于跟踪文件中的哪些页面正在使用最后,还有一个B+树的根节点完整代码lab5的讲义真的很重要,讲清楚了很多逻辑,另外也提供很多方法可以直接调用,如果是自己从0开始我觉得lab5的难度可能是最大的,不过理解清了B+树的结构的话做起来就没那么难受了。还剩最后一个lab的报告没写了,加油!

2023-02-03 14:44:31 267

原创 MIT6.830 lab4 一个简单数据库实现

这次的效率还算比较高,主要是在家也没什么事情做,就写写报告好了。完整代码整个lab4理解了做起来挺快的,记得最开始做的时候不知道Lock部分怎么实现,参考了网上前辈的方法,今天写报告的时候也发现了之前一些漏洞。还有两个lab报告没写,这些全部写完后如果有时间可能还是会考虑做一下lab3,说是这么说,但感觉应该没有多少时间了,毕竟学校里面的文章也是大头。

2023-02-02 15:21:26 350

原创 MIT6.830 lab2 一个简单数据库实现

上次说要写这个报告,半年过去了,我终于决定写lab2了。今天导师发消息让过完大年返校了,拖了半年的实验报告也重新启动,当然下一篇报告什么时候写就不一定了,提前预告下一篇写lab4,lab3我没有做,因为这部分内容是让去实现一个解析优化,我不想在这方面涉入太深,不然这个方向学着学着不就成数据库开发工程师了,然后去搞分布式存储什么的哈哈哈哈。

2023-01-30 21:52:45 552

转载 位运算的常见技巧

其核心逻辑就是,n - 1 一定可以消除最后一个 1,同时把其后的 0 都变成 1,这样再和 n 做一次 & 运算,就可以仅仅把最后一个 1 变成 0 了。原文链接:https://blog.csdn.net/u012068483/article/details/108222415。一个数和它本身做异或运算结果为 0,即 a ^ a = 0;一个数和 0 做异或运算的结果为它本身,即 a ^ 0 = a。n&(n-1) 这个操作是算法中常见的,作用是消除数字 n 的二进制表示中的最后一个 1。

2022-12-20 22:20:24 89

原创 MySQL实战45讲总结

不论是先实践再搞清楚原理去解释,还是先明白原理再通过实践去验证,都不失为一种好的学习方法,因人而异。但是,怎么证明自己是不是真的把原理弄清楚了呢?答案是说出来、写出来。如果有人请教你某个知识点,那真是太好了,一定要跟他讲明白。不要觉得这是在浪费时间。因为这样做,一来可以帮你验证自己确实搞懂了这个知识点;二来可以提升自己的技术表达能力,毕竟你终究要面临和这样的三类人讲清楚原理的情况,即:老板、晋升答辩的评委、新工作的面试官。

2022-11-26 21:38:20 760

原创 Spring面试题之AOP增强顺序

数值越低,表明优先级越高,@Order 默认为最低优先级,即最大数值。不同aspect,advice的执行顺序:先入后出,后入先出。直接上结果,图片转自。

2022-10-13 16:11:39 369

原创 Spring中的循环依赖

当实例化完成之后,要开始进行初始化赋值操作了,但是赋值的时候,值的类型有可能是引用类型,需要从spring容器中获取具体的某个对象来完成赋值操作,而此时,需要引用的对象可能被创建了,也可能没被创建,如果被创建了,那么直接获取即可,如果没有创建,在整个过程中就会涉及到对象的创建过程,而内部对象的创建过程中又会有其他的依赖,其他的依赖中有可能包含当前的对象,而此时当前对象还没有创建完成,所以此时产生了循环依赖问题。

2022-10-06 18:58:45 248

原创 Spring面试题之Spring创建对象的五种方式

实现InstantiationAwareBeanPostProcessor接口,其中InstantiationAwareBeanPostProcessor是一个BeanPostProcessor,它可用于处理bean实例创建前后的回调;System . out . println("beanName:" + beanName + "执行postProcessBeforeInstantiation方法");

2022-10-03 13:55:07 334

原创 FactoryBean与BeanFactory的区别

FactoryBean为容器中的Bean的实现提供了更加灵活的方式,FactoryBean在IOC容器的基础上,给Bean的实现加上了一个简单工厂模式和装饰模式,它是一个能生产或者修饰对象生成的工厂Bean。可以看见,从容器的getBean()方法中获取到的Bean对象,实际上是FactoryBean的getObject()方法创建并返回的Bean对象,而不是FactoryBean本身。getObject(’ name ‘)返回工厂中的实例,而getObject(’ &name ')返回工厂本身的实例。

2022-09-30 15:20:23 405

原创 Spring IoC源码阅读

最近在看Spring源码,本来想全部看了后写文档总结,但怕后面懒不想写,就准备先写一篇。Spring是很多模块的集合,是一款开源的轻量级 Java 开发框架,旨在简化企业开发以及提高系统的可维护性。Spring 最重要的概念是IoC 和 AoP,关于定义不再多做介绍,本文主要是介绍IoC源码部分。IoC中总体来说分为两部分,一个是创建 Bean 容器,一个是初始化 Bean。全文的流程关系主要如下图所示,该图来自于马士兵教育Spring公开课。

2022-09-25 20:44:15 263

原创 Arrays.sort()的底层实现原理

最近在leetcode刷题,遇到挺多Arrays.sort()这个API,今天在牛客网看到有面试官问这个API对于快排做了什么优化,那么面向面试学习的我也要去学习一下啦。本文基于JDK1.8。Arrays.sort()并不是单一的排序,而是插入排序,快速排序,归并排序三种排序的组合。

2022-09-23 22:29:57 3428

原创 Java中的final关键字

final的作用,防止类被继承、方法被重写、变量被修改。天生就是线程安全的,不需要额外的开销。

2022-09-07 16:33:35 167

原创 Java并发包的灵魂AbstractQueuedSynchronizer

我们在写这个系列的时候提到了很多并发工具,比如ReentrantLock、Semaphore,在这些工具的实现里面都用了一个共同的基类,也就是这篇文章要介绍的AbstractQueuedSynchronizer(AQS)。AQS是一个用于构建锁、同步器、协作工具类的框架,提供了同步状态的原子管理、阻塞和唤醒线程以及队列的管理功能。

2022-09-06 16:59:48 391

原创 JUC系列之并发队列

前面在写JUC系列之线程池的使用的时候,构造线程池的时候有一个参数叫做工作队列,其实现就是不同的BlockQueue阻塞队列,在这里BlockQueue也是一种并发队列,本篇文章主要是介绍阻塞的并发队列。

2022-09-04 16:50:41 338

原创 JUC系列之CopyOnWrite容器

前面写了一篇从ConcurrentHashMap出发引发的一系列思考,这里再介绍一个并发容器,ConcurrentHashMap是通过cas和synchronized保证并发的,而CopyOnWrite系列容器是通过创建副本和ReentrantLock保证并发。

2022-09-04 00:11:47 154

原创 ThreadLocal源码及其内存泄漏问题

ThreadLocal提供了线程的局部变量,该变量对其他线程而言是隔离的,每个线程都可以通过set()和get()来对这个局部变量进行操作,但不会和其他线程的局部变量进行冲突,实现了线程的数据隔离。Synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问,多线程同时操作共享变量并且能正确的输出结果;ThreadLocal是为每一个线程都提供了变量的副本,把共享变量变成线程私有了,每个线程都有独立的一个变量。ThreadLocal的实例和他的值仍然是放到在堆的。ThreadLoc

2022-08-29 23:53:09 457

原创 线程的创建方式与线程池的使用

前面几天忙着写论文好久没更新文章了,不能这么懈怠,还是得随时进行学习的反馈。虽然前面的坑还没填完,但我现在又准备开新坑了o( ̄︶ ̄)o。目前计划开个新专栏专门整理一下java.util.concurrent,Java并发包,也当做是复习,这一篇呢就是这个新系列的第一篇文章,话不多说,直接开冲!首先,如果我们直接使用JDK封装好的构造函数自动创建线程会发生什么,答案是可能由于使用无界工作队列导致任务堆积或者直接创建新的线程转发任务导致过多线程资源,发生内存溢出的问题。如果自定义合适的线程池呢?

2022-08-28 23:49:34 562

原创 从ConcurrentHashMap出发引发的一系列思考

在做mit6.830时,关于数据库的全局目录catalog类持有一个线程安全的去保存数据库中每一张表。为了避免多个线程对数据库目录修改造成数据不一致的情况,是不能使用HashMap的,这是因为HashMap是线程不安全的。...

2022-08-07 16:24:03 872

空空如也

空空如也

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

TA关注的人

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