自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 我眼中的ReentrantLock-插队

ReentrantLock是JDK提供给开发者的一个工具锁,基于AQS(AbstractQueuedSynchronizer)实现,可用于synchronized同功能替换。其内部提供公平和非公平两种实现方式(Synchronized只有非公平),未获取到锁的线程会加入队列(公平锁和非公平锁加入队列的方式不同),由AQS维护双向队列。

2024-10-18 14:40:00 454

原创 Java中的基本循环结构详解

Java的三种基本循环结构——for循环、while循环和do-while循环——各有其适用场景。for循环适用于已知循环次数的情况,while循环适用于循环次数不确定但需要满足某个条件的情况,而do-while循环则确保循环体至少执行一次。通过合理选择和使用这些循环结构,可以编写出高效、简洁的代码。

2024-10-18 14:38:18 619

原创 博客记录-day011

场景:是一个案例中使用到了注解,我们也可以自定义一个 Conditional 的实现类,之后把这个实现类配置到需要实例化的对象上面,通过 matches 匹配条件方法的实现,决定是否实例化。用途:这个场景的用途和是一样的,只不过我们可以更好的自定义控制。

2024-10-18 14:37:45 804

原创 全新Java 面试八股文——java框架篇

生命周期1. 实例化一个 Bean,也就是我们通常说的 new2. 按照 Spring 上下文对实例化的 Bean 进行配置,也就是 IOC 注入3. 如果这个 Bean 实现 dao 了 BeanNameAware 接口,会调用它实现的setBeanName(String beanId)方法,此处传递的是 Spring 配置文件中 Bean 的 ID4. 如果这个 Bean 实现了 BeanFactoryAware 接口,会调用它实现的 setBeanFactory(),

2024-10-18 14:00:53 750

原创 内存屏障的前世今生

结合读写屏障的功能,确保读写操作的完整顺序,清空 Store Buffer 并处理 Invalid Queue,确保多核环境中的数据一致性和可见性。:MESI 通过监控各个核心之间的数据状态(嗅探机制),保证每当一个核心修改了数据,其他核心的缓存会自动将该数据标记为无效,从而保证一致性。块或方法会确保进入块或者方法之前,其他线程对共享变量的修改对当前线程可见,这相当于在进入和退出时分别插入了内存屏障。,解决多核下缓存不一致的问题,最常见的缓存一致性方案。,确保之后的读操作读取到的是主内存中的最新值。

2024-10-17 14:17:31 870

原创 泛型实战1

使用基于类型推导的泛型类,泛型方法以使代码变得更加健壮。避免使用源生类型,对于未知类型的集合请使用通配符,以加强代码的约束性。合理使用有限制的通配符,提升你的 API 灵活性。

2024-10-17 14:16:43 374

原创 Stream流中collect方法

arduino代码解读复制代码。

2024-10-17 14:12:58 330

原创 2024年八股之Java并发编程

wait()是让获得对象锁的线程实现等待,会自动释放当前线程占有的对象锁。每个对象(Object)都拥有对象锁,既然要释放当前线程占有的对象锁并让其进入 WAITING 状态,自然是要操作对应的对象(Object)而非当前的线程(Thread篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题。

2024-10-17 13:53:04 1270

原创 Kafka 为什么Kafka 为什么要抛弃 Zookeeper?要抛弃 Zookeeper?

本文,我们分析了为什么 Kafka 要移除 ZooKeeper,主要原因有两个:ZooKeeper不能满足 Kafka的发展以及 Kafka想创建自己的生态。在面临越来越复杂的数据流处理需求时,KRaft 模式为 Kafka 提供了一种更高效、简洁的架构方案。不论结局如何,Kafka 和 ZooKeeper曾经也度过了一段美好的蜜月期,祝福 Kafka 在 KRaft模式越来越强大,为使用者带来更好的体验。

2024-10-16 19:26:59 902

原创 String类型

来创建字符串时,JVM会首先检查字符串常量池。如果池中存在相同值的字符串对象,返回池中对象的引用;如果没有,JVM会在池中创建一个新的字符串对象并返回其引用。关键字创建字符串时,JVM不会去检查字符串常量池,而是直接在堆内存中创建一个新的对象,即使常量池中已经有了相同的字符串对象。来一道思考题:很明确,代码输出的结果是:"111111222222",但是它工作原理是怎样的呢?等)看起来像是对原字符串进行了修改,但实际上它们返回的是新的。通过直接量创建,因此会放入字符串常量池中。来存储字符串的字符。

2024-10-16 16:17:56 260

原创 2024年 Java 面试八股文(20w字)

基本数据类型,如int,float,double,boolean,char,byte,不具备对象的特征,不能调用方法。装箱:将基本类型转换成包装类对象拆箱:将包装类对象转换成基本类型的值java为什么要引入自动装箱和拆箱的功能?主要是用于java集合中,List list=new ArrayList();list集合如果要放整数的话,只能放对象,不能放基本类型,因此需要将整数自动装箱成对象。

2024-10-16 14:02:56 1270

原创 Java 源码阅读 - Iterable (可迭代对象)

Iterable是Collections - 集合的父类, 也是所有集合相关的数据结构的基础接口, 我在自己的项目中发现有大约 6000 多个三方包都实现了这个接口, 其中不乏有 Netty, Gurva 这类知名的第三方包, 因此读懂这个类对于理解 Java 的集合是非常有必要的。

2024-10-15 14:26:08 369

原创 老板爱瞎改权限怎么办:注解结合AOP打造复杂权限体系

组织权限通常指的是基于用户所属组织结构的权限。这种权限控制方式允许系统根据用户所在的部门、团队或公司层级来限制或授权访问。例如,一个公司的财务部门可能只能访问与财务相关的数据和功能,而不能访问人力资源或研发部门的数据。个人权限则是指分配给特定用户的权限,与用户所属的组织结构无关。这种权限控制方式允许系统为每个用户定制访问控制,以满足个性化的需求。例如,一个销售代表可能被授权访问客户数据,但仅限于他们自己的客户记录。注解用于标记需要特定权限才能访问的方法。

2024-10-15 14:25:38 875

原创 Redis数据持久化详解:从RDB到AOF再到混合持久化

RDB是Redis默认的持久化方式,它会在指定的时间间隔内生成数据集的快照,并将其保存到磁盘上。RDB文件是一个紧凑的二进制文件,适合备份和灾难恢复。AOF是另一种持久化方式,它记录每个写操作并将其追加到日志文件中。AOF文件可以重放日志中的命令来重建数据集。

2024-10-15 14:25:02 475

原创 2024年最新版Java面试八股文!

线程池就是提前创建若干个线程,如果有任务需要处理,线程池里的线程就会处理任务,处理完之后线程并不会被销毁,而是等待下一个任务。由于创建和销毁线程都是消耗系统资源的,所以当你想要频繁的创建和销毁线程的时候就可以考虑使用线程池来提升系统的性能。java 提供了一个java.util.concurrent.Executor 接口的实现用于创建线程池。CAS 是 compare and swap 的缩写,即我们所说的比较交换。cas 是一种基于锁的操作,而且是乐观锁。在 java 中锁分为乐观锁和悲观锁。

2024-10-15 13:32:15 840

原创 分布式定时任务XXL-Job源码阅读

分布式:把一个大业务拆分成多个子业务,每个子业务都是一套独立的系统,子业务之间相互协作最终完成整体的大业务。集群:把处理同一个业务的系统部署多个节点。部署在不同服务器上的相同系统必然要做负载均衡。集群主要是简单加机器解决问题,对于问题本身不做任何分解。集群和分布式都是由多个节点组成,但集群中各节点间基本不需要通信协调,而分布式中各个节点的通信协调是必不可少的比如我们一个用户服务集群之间都没啥通信,但是用户服务和订单服务构成一个分布式系统经常要相互调用但其实往往说。

2024-10-14 14:17:34 1011

原创 深入浅出Java多线程

线程同步队列使用实现,它能够自动处理线程间的同步问题,适合生产者-消费者模型。双向队列使用Deque接口及其实现类,提供线程安全的双向队列操作。单向队列(也称为FIFO 队列,First In First Out)是一种只能从一端插入元素,从另一端移除元素的数据结构。队列遵循先进先出(FIFO)原则,首先加入队列的元素会首先被取出。在 Java 中,可以使用Queue接口及其常见实现类(如LinkedList或ArrayDeque)来实现单向队列。

2024-10-14 14:15:34 931

原创 一种失传已久的 SQL 多表连接查询,你从来没有见过的独门写法

使用 Hibernate 的代价就是你的心智负担很大。除了要学习很多注解以外,还有很多夸张的概念需要深入理解,才能够写出能正常运行的代码。这样的结果是无法返回给客户端直接使用的。那么,有没有一种简单的方法,可以通过 SQL 的方式,直接查询出这种嵌套的结果集, 然后扔给客户端进行处理呢?这是显而易见的,因为这是一个 "Flatten" 的结果。不幸的是这样的处理非常麻烦,你 join 的表越多这个代码越不好写,不相信你可以试试。假设你有这样一个 n2n 的关系表,代表用户和角色之间的关系。

2024-10-14 14:10:52 367

原创 2024最详细的Java八股文合集!

1、HashMap底层,插入,扩容前置知识:二叉树:每个节点至多只有两个子节点的搜索二叉树:满足当前节点的左子树上的节点不能大于当前节点,右子树上的节点不能小于当前节点的二叉树红黑树:一种自平衡的搜索二叉树,能保证遍历,插入,删除的时间复杂度永远是O(logn)红黑树规则:红黑:节点只有红黑两种颜色,根节点和叶节点一定是黑色,红节点的子节点一定是黑色树:叶节点一定是null,任一节点到叶节点的所有路径包含相同数量的黑节点散列表:又称Ha

2024-10-14 13:50:56 1298

原创 CyclicBarrier,CountDownLatch,Semaphore的实现原理,以及使用场景

适合多线程协调的阶段性同步,所有线程需要同时达到某个状态才继续执行,且可以重用。适合一次性等待其他线程完成某些操作,倒计时计数器达到 0 后,阻塞的线程才会被唤醒。Semaphore用于控制并发线程的数量,限制访问共享资源的线程数,适合限流或资源保护场景。

2024-10-11 16:17:29 404

原创 通过Java请求使用API获取商品数据:解锁电商洞察

在电子商务的快速变化中,获取实时商品数据是企业做出快速决策的关键。Java,作为一种成熟且广泛使用的编程语言,提供了强大的工具和库来发送HTTP请求和处理API响应。本文将向您展示如何使用Java请求使用API获取商品数据,以及如何利用这些数据来增强您的业务洞察力。

2024-10-11 16:14:53 370

原创 【JVM系列】内存布局详解

熟悉 Java 语言特性的同学都知道,相比 C、C++ 等编程语言,Java 无需通过手动方式回收内存,内存中所有的对象都可以交给 Java 虚拟机来帮助自动回收;而像 C、C++ 等编程语言,需要开发者通过代码手动释放内存资源,否则会导致内存溢出。尽管如此,如果编程不当,Java 应用程序也可能会出现内存溢出的现象,例如下面这个异常!java代码解读复制代码它表示当前服务已出现内存溢出,简单的说就是当服务出现了内存不足时,就会抛异常。这种异常是怎么出现的呢?该如何解决呢?

2024-10-11 16:08:19 337

原创 堪称2024最强Java八股文面试题汇总!

1.1、你在最近的项目中哪些场景使用了redis呢?一是验证你的项目场景的真实性,二是为了作为深入发问的切入点。缓存缓存三兄弟(穿透、击穿、雪崩)、双写一致、持久化、数据过期策略,数据淘汰策略分布式锁setnx、redisson消息队列、延迟队列何种数据类型

2024-10-11 14:09:55 726

原创 Spring事务的1道面试题

每次聊起Spring事务,好像很熟悉,又好像很陌生。本篇通过一道面试题和一些实践,来拆解几个Spring事务的常见坑点。

2024-10-10 14:53:16 632

原创 从最简单的窗体应用开始

继承,继承了窗体的外观和行为。在对窗体实例化时,通过继承的方法对窗体进行设置,而没有暴露出内部属性来赋值,这体现了封装性。该示例程序使用了面向对象中的继承和封装两大特性。

2024-10-10 14:43:53 146

原创 【JVM系列】类的加载过程介绍

我们知道 Java 是先通过编译器将.java类文件转成.class字节码文件,然后再通过虚拟机将.class字节码文件加载到内存中来实现应用程序的运行。那么虚拟机是什么时候加载class文件?如何加载class文件?class文件进入到虚拟机后发生了哪些变化?今天我们就一起来了解一下,虚拟机是如何加载类文件的。

2024-10-10 14:41:35 1049

原创 2024年完整版Java面试八股文!

1、String能被继承吗 为什么用final修饰 难度系数:⭐不能被继承,因为String类有final修饰符,而final修饰的类是不能被继承的。String类是最常用的类之一,为了效率,禁止被继承和重写。为了安全。String 类中有native关键字修饰的调用系统级别的本地方法,调用了操作系的 API,如果方法可以重写,可能被植入恶意代码,破坏程序。Java 的安全性也体现在这里。

2024-10-10 14:17:19 1231

原创 你是如何使用 wait () 方法的?使用 if 还是 while

虚假唤醒是指线程在没有被显式唤醒(例如通过。

2024-10-09 14:18:57 400

原创 缓存预热技术详解:提升系统性能的关键

缓存预热是一种有效的技术手段,通过在系统启动或特定时间点预先加载常用数据,可以显著提升系统的性能和稳定性。本文介绍了缓存预热的原理、优势以及常见的实现方法,并提供了Java示例代码。通过合理地使用缓存预热技术,开发者可以为用户提供更快、更稳定的服务体验。

2024-10-09 14:18:27 417

原创 Spring Boot3集成iText实现PDF导出功能

iText 是一个功能强大的开源 Java 库,用于创建和操作 PDF 文件。iText 提供了丰富的 API,可以生成交互式 PDF 文档、添加书签、页码、水印,以及拆分和合并 PDF 文档等。iText 支持将 PDF 保存为图像文件,如 PNG 或 JPEG,并且可以在 PDF 文档上绘制各种几何形状,如圆形、线条等。iText的主要特点交互性:可以创建交互式 PDF 文档,如表单填写。添加元素:可以添加书签、页码、水印等。分割与合并:可以将现有 PDF 分割或合并其他页面。表单处理。

2024-10-09 14:17:53 820

原创 2024全新Java面试八股文总结

1、线程的状态转换有什么(生命周期) 难度系数:⭐新建状态(New) :线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。例如,thread.start()。处于就绪状态的线程,随时可能被CPU调度执行。运行状态(Running):线程获取CPU权限进行执行。需要注意的是,线程只能从就绪状态进入到运行状态。阻塞状态

2024-10-09 14:04:01 1527

原创 3.snail-job广播任务

的确是每个客户端都执行了同一个任务批次的确是所有客户端全部成功,最终这个批次的任务才算执行处理成功广播任务类型适合在同一时间,所有客户端均执行同一个任务的场景。每个客户端节点均执行同一个批次任务所有客户端均成功该批次任务才算处理成功;有任何一个失败,该批次任务处理失败。

2024-10-08 14:20:39 478

原创 已上线!手把手带你Java服务端实现支付功能的通用解决方案!(全网最新)

前段时间,和朋友们一起搭建的一个网站需要实现支付功能,使得用户支付后可以成为会员并且能使用更多一些强大的功能。让网站也具备一定的盈利能力。平时大家用的支付基本上也就是微信支付、支付宝支付、银行卡支付了。我们也是成功接入了微信支付,并且上线。目前网站仍处于一个内测阶段,大家如果有什么问题或者有更好的建议我们可以在下方评论区一起交流一下🌹下面以最新版本的微信支付。

2024-10-08 14:19:11 910

原创 星辰计划5-深入解析源码(逐行debug)dubbo服务引用,调用

简单总结一下 Invoker和Protocol是非常重要的Dubbo模型,他们计划贯穿了dubbo非常核心的服务暴露和引用。Protocol是Dubbo是非常重要的实体 它负责服务的暴露和引用,它管理着 Invoker的生命周期,Invoker是dubbo 非常重要的实体,他是dubbo非常核心的模型,其他模型可以向他靠拢,或者转换成它,它代表一个可执行体,可以发起Invoke调用 他有集群Invoker (ClusterInvoker) 本地Invoker,远程 Invoker再附上两个的核心图。

2024-10-08 14:16:20 677

原创 Sentinel:微服务的全能守护

Sentinel是由阿里巴巴开源的一款轻量级的流量控制、熔断降级的库。它的名字来源于英文中的“哨兵”,意味着它能够监控并保护你的应用不受不稳定流量的影响。

2024-10-08 14:13:40 935

原创 Java八股文面试题之Java基础篇(一)

首先,序列化的核心目的是解决多个JVM进程之间的对象传输问题,也就是说,如何把当前JVM进程里面的一个对象,传递到另外一个JVM进程里面。序列化,就是把内存里面的对象转化为字节流,以便用来实现存储或者传输。反序列化,就是根据获取到的对象的字节流,解析里面保存的对象描述信息和状态等重新构建一个新的对象。需要注意的是,反序列化得到的是一个与原始对象状态一致的新对象,与原始对象并不是同一个对象实例。

2024-10-08 13:43:29 1610

原创 NIO实现聊天室之:一切都要从网络编程的基础开始聊起!

今天就说这么多啦,主要介绍一下网络编程相关的基础知识,在后续的博文中针对网络编程所需要的内容,再进一步的整理与细化。

2024-10-07 21:52:57 943

原创 MySQL新增字段/索引会不会锁表?

MySQL5.6之后,实际单纯的增加一个字段,表结构修改和索引添加通常不会锁定整个表。在某些情况下,MySQL可能需要锁定整个表。同时数据量过大的时候,会出现一些性能问题。所以实际操作的过程中,要关注表的数据多小,最终的数据大小(要关注索引数据)。同时如果你的MySQL版本较旧或出于某些特殊原因不支持在线DDL操作。需要特别注意在非高峰期执行操作,以尽量减少对业务的影响。

2024-10-07 21:52:05 651

原创 xxl-job调度平台之任务触发

两个线程,一个线程查表,获取将到期任务,放入时间轮中,交由另一个线程来处理;这种设计在定时任务的实现中常被采用;采用DB表行锁,在调度平台多节点间,避免并发调度;调度过期策略,是有业务价值的;任务执行可能出现一个周期的延迟如调度平台节点A,将5秒内到期的任务放入ringData,然后宕机了,且TriggerNextTime已被修改;节点B紧接着执行时,得等到下一个到期时间,才能查询到这个任务;

2024-10-07 21:47:53 709

原创 Java最新面试八股文(2024年10月持续更新.....)

1、什么是 CASCAS 是 compare and swap 的缩写,即我们所说的比较交换。cas 是一种基于锁的操作,而且是乐观锁。在 java 中锁分为乐观锁和悲观锁。悲观锁是将资源锁住,等一个之前获得锁的线程释放锁之后,下一个线程才可以访问。而乐观锁采取了一种宽泛的态度,通过某种方式不加锁来处理资源,比如通过给记录加 version 来获取数据, 性能较悲观锁有很大的提高。CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。如果内存地址里面的值和 A 的值是一样的

2024-10-07 19:30:52 1450

空空如也

空空如也

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

TA关注的人

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