自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

入坑太深起不来

经验分享

  • 博客(65)
  • 收藏
  • 关注

原创 【并发】第九篇 Atomic原子操作类 - 字段更新器类详解

Atomic的字段更新器类是Java中一种用于实现线程安全的字段更新操作的类。它提供了一组原子操作,可以对字段进行原子性的更新。在并发环境中,多个线程同时更新一个字段可能会出现竞态条件(Race Condition)导致数据不一致的问题。Atomic的字段更新器类基于CAS(Compare And Swap)操作机制来保证对字段的原子操作,避免了竞态条件的发生。Atomic的字段更新器类的常用实现包括(原子更新整型的字段的更新器)、(原子更新长整型字段的更新器)、(原子更新引用类型里的字段)等。

2024-04-17 18:03:06 625

原创 【并发】第八篇 Atomic原子操作类 - 引用类型类详解

Atomic原子操作类是Java中提供的一组线程安全的基本数据类型操作类,可用于实现线程安全的并发编程。它们可以确保在并发环境下对变量进行原子操作,即不会被其他线程中断或同时修改。原子更新基本类型的 AtomicInteger,只能更新一个变量, 如果要原子更新多个变量,就需要使用这个原子更新引用类型提供的类,包括。注: 源码版本是基于JDK1.8 版本。

2024-04-17 16:33:43 1012

原创 【并发】第七篇 Atomic原子操作类 - 数组类型类详解

Atomic原子操作类是Java中提供的一组线程安全的基本数据类型操作类,可用于实现线程安全的并发编程。它们可以确保在并发环境下对变量进行原子操作,即不会被其他线程中断或同时修改。

2024-04-16 14:55:11 661

原创 【并发】第六篇 Atomic原子操作类 - 基本类型类详解

Atomic原子操作类是Java中提供的一组线程安全的基本数据类型操作类,可用于实现线程安全的并发编程。它们可以确保在并发环境下对变量进行原子操作,即不会被其他线程中断或同时修改。常用的基本类型类有AtomicLong和。

2024-04-15 16:39:03 990

原创 【并发】 第五篇 原子操作(二) - CAS 详解

CAS是"比较并交换"(Compare and Swap)的缩写。是一种并发控制机制,用于实现多个线程同时对同一数据进行原子操作(读取、写入、更新),并且能够保证操作的一致性。# 1.比较:通过比较当前值和期望值是否一致来判断是否修改成功# 2.交换:如果一致则修改,否则重新尝试。CAS的一种常见应用是实现乐观锁。在乐观锁机制中,线程在更新共享变量之前先检查该变量是否被其他线程修改过,如果没有修改则更新,否则重新尝试。CAS操作正是基于这个原理来实现的。

2024-04-12 14:49:49 878

原创 【并发】 第四篇 原子操作

此时,如果有其他线程也执行对该共享变量的值进行修改操作, 那么上述的三个步骤,就会受到其他线程的干扰,最终内存中的共享变量值可能就不是期望的结果。这是因为每个线程最开始从内存中获取的值, 有可能被其他线程修改了, 线程之间的数据是不同步的, 导致线程最后写入的值会被其他线程覆盖。上述的例子中,线程的操作会受到其他线程的干扰, 并非原子操作, 而使用原子操作即可解决上述现象。原子操作是指不能被中断的一组操作,要么全部执行成功,要么全部不执行,不会出现部分执行的情况。将上面的例子代码优化下,

2024-04-12 10:48:38 437

原创 【算法】第二篇 大衍数列

大衍数列,来源于《乾坤谱》中对易传“大衍之数五十”的推论。主要用于解释中国传统文化中的太极衍生原理。数列中的每一项,都代表太极衍生过程中,曾经经历过的两仪数量总和。是中华传统文化中隐藏着的世界数学史上第一道数列题。前10项为: 0、2、4、8、12、18、24、32、40、50……

2024-04-08 15:43:38 394

原创 【算法】第一篇 外观数列

外观数列是指数列中的每一项都是描述前一项的外观或者外貌。它通常由初始项开始,通过描述前一项的外观来生成下一项。

2024-03-29 15:55:47 410

原创 【并发】第三篇 Hash冲突的解决方法

哈希(hash)是将任意长度的输入数据转化为固定长度的输出数据的算法。哈希函数会将输入数据压缩并映射为一个固定长度的哈希值,通常用一个字符串或数字来表示。哈希冲突是指两个不同的输入值在经过哈希函数计算后得到了相同的哈希值。由于哈希函数的输出长度是固定的,而输入的数据可能有无限多的可能性,所以哈希冲突是不可避免的。哈希冲突会引起一些问题,例如当使用哈希表进行数据存储时,如果有两个不同的键经过哈希函数计算得到了相同的哈希值,就会导致数据冲突,可能会导致数据丢失或覆盖。

2024-03-27 17:47:53 842

原创 【并发】第二篇 ThreadLocal详解

ThreadLocal 是 Java 中的一个类,它提供了线程局部变量的机制。线程局部变量是指每个线程都有自己独立的变量副本,线程之间互不影响。通常情况下,如果多个线程同时访问一个共享变量,需要进行同步来保证线程安全,如Synchronized。而使用 ThreadLocal 也可以避免线程安全问题,因为每个线程都拥有自己的变量副本,且可以独立地操作自己的变量副本,而不会影响其他线程的副本。线程之间的变量副本互不干扰,保证了线程安全。

2024-03-27 11:05:09 996

原创 【并发】第一篇 引用类型详细介绍

Java中有四种引用类型,它们分别是强引用(Strong Reference),软引用(Soft Reference),弱引用(Weak Reference)和虚引用(Phantom Reference)。每种引用类型在Java垃圾回收过程中的行为和使用场景略有不同。

2024-03-21 00:03:23 940

原创 【Spring Boot】第二篇 自动装配原来就这么简单

基于注解的Spring Boot的自动装配是Spring Boot框架中的一种特性,它允许开发者使用注解来简化和自动化应用程序的配置和装配过程。通过使用特定的注解,Spring Boot可以根据应用程序的依赖关系和配置来自动装配和配置一系列的Bean对象和组件。开发者只需要在相应的类或方法上添加特定的注解,Spring Boot就会根据这些注解的配置信息自动完成相应的初始化和装配工作。简单来说,就是解放开发者的双手, 一切的脏活累活直接交给Spring Boot来完成。

2024-02-08 11:41:27 909

原创 【Spring Boot】第一篇 创建简单的Spring Boot项目

Spring Boot是一个用于构建独立的、生产级别的Spring应用程序的框架。它简化了Spring应用程序的创建和配置过程,同时提供了很多开箱即用的功能,包括自动配置、内嵌服务器等。通过Spring Boot,开发人员可以更快速地开发出高质量的Spring应用程序。

2024-02-06 15:57:07 1654 3

原创 【JVM】第五篇 垃圾收集器G1和ZGC详解

ZGC收集器能仅从引用上就明确得知一个对象是否处于重分配集之中,如果用户线程此时并发访问了位于重分配集中的对象,这次访问将会被预置的内存屏障(读屏障)所截获,然后立即根据Region上的转发表记录将访问转发到新复制的对象上,并同时修正更新该引用的值,使其直接指向新对象,ZGC将这种行为称为指针的“自愈”Self-Healing)能力。统一存储器存储结构,表示内存只有一块,所有的CPU都去访问这一块内存,会存在内存竞争,有竞争就会有锁的问题,有锁就会影响执行的效率,并且CPU核心数越多,竞争就会越激烈。

2023-09-27 17:19:46 861

原创 【JVM】第四篇 垃圾收集器ParNew&CMS底层三色标记算法详解

当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。的特点特出的一种标记算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。优缺点: 效率高,但是只能使用在年轻代,不能使用在老年代中,老年代中大多数的对象都是存活的,没有多余的担保空间来将内存一分为二。如老年代中对象的存活几率是非常高的,而且没有额外的空间进行分配担保,所以选择“标记-清除”或“标记-整理”算法进行垃圾收集。

2023-09-27 14:29:06 854

原创 【JVM】第三篇 JVM对象创建与内存分配机制深度剖析

大量的对象被分配在Eden区,Eden区满了后会触发Minor GC,可能会有99%以上的对象成为垃圾被回收掉,剩余存活的对象会被挪到S0区,下一次Eden区满了后又会触发Minor GC,把Eden区和survivor区垃圾对象回收,把剩余存活的对象一次性挪动到S1区,因为新生代的对象都是朝生夕死的,存活时间很短,所以JVM默认的8:1:1的比例是很合适的,让Eden区尽量的大,Survivor区够用即可。JVM内存布局规定了Java在运行过程中的内存申请、分配、管理的策略,保证了JVM高效的运行。

2023-09-26 01:39:03 955

原创 【JVM】第二篇 JVM内存模型深度剖析与优化

按照线程是否共享来划分TLAB线程本地分配缓存区,这是一个线程专用的内存分配区域由于对象一般会分配在堆上,而堆是全局共享的。因此在同一时间,可能会有多个线程在堆上申请空间。因此,每次对象分配都必须要进行同步,在竞争激烈的场合分配的效率又会进一步下降, JVM使用TLAB来避免多线程冲突,在给对象分配内存时,每个线程使用自己的TLAB,这样可以避免线程同步,提高了对象分配的效率JVM内存模型清晰版(结合代码分步解析)int a = 1;int b = 2;return c;

2023-09-24 23:03:32 641

原创 【面试篇】集合相关高频面试题

从上面的例子发现, 虽然HashCode的倒数第二第三位从0变成了1,但是运算的结果都是1001。因为HashMap的设计者认为后插入的元素, 被访问到的概率最大, 所以HashMap在使用链表解决hash冲突的元素时,采用了头插法, 这样每次访问链表时, 先判断头节点是否等于目标节点, 如果是,直接返回目标节点, 不需要再去遍历整个链表了, 提升了查询效率。来计算hash值, 将初始容量设置为16,能最大程度的将元素散列的分布在数组上, 且最大程度的减少hash冲突的产生, 符合Hash算法。

2023-09-20 01:31:13 297

原创 【Map篇】HashTable详解

快速查找:Hashtable中的键值对是通过哈希函数计算索引值得到的,因此可以快速地查找元素,时间复杂度为 O(1)。高效插入和删除:由于哈希表的键值对是通过哈希函数计算索引值得到的,所以在插入或删除元素时,只需要计算一次哈希值即可定位元素,因此插入和删除操作都非常快速,时间复杂度为 O(1)。空间利用率高:哈希表只需要存储键和值,不需要额外的空间来存储指向下一个元素的指针,因此空间利用率比较高。可扩展性。

2023-09-20 01:07:13 190

原创 【Map篇】HashMap详解

在 Java 中的 HashMap 是基于哈希表实现的,哈希表的核心是数组,而数组的大小是固定的。当我们往 HashMap 中添加元素时,如果当前位置已经有元素了,则会发生碰撞,这个时候 HashMap 会依据一定的规则将元素添加到数组的其他位置。如果想要提高 HashMap 的性能,就需要尽可能减少碰撞。一种有效的方式就是通过调整数组的大小,增加数组的容量,从而使得元素分布更加均匀,减少碰撞的发生。而为了在扩容后保持哈希表中原有元素的位置不变,HashMap 采用了重新哈希的方法来处理。

2023-09-19 18:10:38 265

原创 【List篇】第四篇 LinkedList 详解

Java中的LinkedList是一种实现了List接口的双向链表数据结构。链表是由一系列节点(Node)组成的,每个节点包含了指向数据item和。Deque两端链表指针的指向O(1)从头开始遍历链表O(n)Cloneable克隆Iterablefor-eachList增删改查。

2023-09-17 23:56:18 471

原创 【List篇】第三篇 ArrayList 的线程不安全介绍

ArrayList 不是线程安全的

2023-09-10 23:21:45 1221

原创 【List篇】第二篇 ArrayList 详解(含图示说明)

Java中的ArrayList是一个动态数组,可以自动扩展容量以适应数据的添加和删除。它可以用来存储各种类型的数据,例如String,Integer,Boolean等。ArrayList实现了List接口,可以进行常见的List操作,例如添加、插入、删除和访问元素等。

2023-09-08 02:46:07 476

原创 【List篇】第一篇 使用Arrays.asList生成的List集合,操作add方法报错

主要是记录一次日常开发中,使用Arrays.asList方法创建list,然后使用add出现异常的场景

2023-09-01 17:00:41 2876

原创 《MySQL》第十四篇 COUNT(*)和 COUNT(1)的区别

本文旨在介绍COUNT(*),COUNT(1),COUNT(col)三者之间区别和使用索引的情况,count() 函数是用来统计行数用的,以下内容均是个人实践模拟结果,仅供参考;

2023-08-03 11:17:35 215

原创 《MySQL》第十三篇 SELECT * 和 SELECT 字段名的区别

不同的写法,可以满足不同的场景。在实际应用中,需要根据具体情况选择合适的写法。如果需要查询所有字段,可以使用 SELECT *。如果需要精确控制查询的字段,可以使用 SELECT 字段。

2023-07-31 15:01:15 1326

原创 《MySQL》第十二篇 数据类型

详细列举MySQL的字段的各种类型

2023-07-27 17:15:34 743

原创 《MySQL》第十一篇 SQL_MODEL模式简述

SQL Mode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL通过设置SQL Mode,可以完成不同严格程度的数据校验,有效地保障数据准确性。通过设置SQL Mode为ANSI模式,来保证大多数SQL符合标准的SQL语法,这样应用在不同数据库之间进行迁移时,就不需要对业务SQL进行较大的修改。在不同数据库之间进行迁移之前,通过设置SQL Mode可以使MySQL上的数据更方便地迁移到目标数据库中。

2023-07-27 15:35:13 947

原创 《Zookeeper》第一篇 集群环境搭建

简单通俗易懂的Zookeeper集群搭建

2023-02-14 17:45:40 1568

原创 《Spring》第二十一篇 事务底层源码解析

一.事务的底层执行原理1. 解析注解@EnableTransactionManagement2. Bean生命周期的初始化后阶段,校验是否需要进行AOP3. 示例FruitsService已经成功生成,并注册到IOC容器中,此时执行pay()方法二. 事务的传播机制

2023-02-09 11:07:25 340

原创 《Spring》第二十篇 简单明了的AOP

目录一. Spring AOP 实现动态代理二. 内部如何实现?1. 解析@EnableAspectJAutoProxy2. 判断Bean是否需要进行AOP3. Spring 如何创建代理类何为AOP, 全程为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。一. Spring AOP 实现动态代理假设现在有一个类StudentService, 如果想在不修改StudentService类的源码前提下,

2022-05-25 09:59:57 231 2

原创 《Spring》第一篇 IDEA导入Spring源码

想要研究Spring源码,那必须知道如何下载并导入IDEA。 文本记录自己在Windows操作系统下导入源码的过程,避免大家走弯路1. 下载源码Spring官网 https://spring.io/projects/spring-frameworkGithub源码下载地址: https://github.com/spring-projects/spring-frameworkgit 克隆地址...

2022-03-17 03:58:04 3038 3

原创 《Spring》第十九篇 注解使用 - @Lazy

目录@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Lazy { /** * Whether lazy initialization should occur. */ boolean

2022-03-04 15:52:15 632

原创 《Spring》第十八篇 循环依赖 (二)

目录1. 原型Bean情况下的循环依赖解析2. 构造方法导致的循环依赖3. @Async情况下的循环依赖解析4. @Transaction情况下的循环依赖解析5. BeanFactoryAware下的循环依赖解析1. 原型Bean情况下的循环依赖解析2. 构造方法导致的循环依赖3. @Async情况下的循环依赖解析4. @Transaction情况下的循环依赖解析5. BeanFactoryAware下的循环依赖解析...

2022-03-02 23:14:39 430

原创 《Spring》第十七篇 循环依赖 [单例]

目录1. Spring 循环依赖简介1. Spring循环依赖底层源码解析2. 原型Bean情况下的循环依赖解析3. 构造方法导致的循环依赖4. @Async情况下的循环依赖解析5. @Transaction情况下的循环依赖解析6. BeanFactoryAware下的循环依赖解析1. Spring 循环依赖简介循环依赖,顾名思义,就是你中有我,我中有你。在Spring中,一个对象并不是简单的new出来的,而是经过一系列的Bean生命周期, 就是因为Bean生命周期的存在,才产生了循环依赖的问题。在了

2022-03-01 22:35:54 153

原创 《Spring》第十六篇 DI自动注入之@Resource注解

目录1. 可以定义的位置2. 简单使用(1) 添加在字段上(2) 添加在方法上3. 底层源码实现原理(1) 寻找注入点(2) 属性注入4. 总结(1) 寻找注入点阶段(2) 依赖注入阶段1. 可以定义的位置从源码的位置看, @Value可以定义在字段,方法,最常见的是定义在属性上@Target({TYPE, FIELD, METHOD})@Retention(RUNTIME)public @interface Resource { String name() default "

2022-02-26 23:24:30 413

原创 《Spring》第十五篇 DI自动注入之@Value注解

二. @Value1. 可以定义的位置从源码的位置看, @Value可以定义在属性字段,方法,参数,最常见的是定义在属性上。只有一个属性元素value@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Value { /

2022-02-23 17:59:45 534

原创 《Spring》第十四篇 DI自动注入之@Autowired注解

目录1. 可以定义的位置2. 不同位置上使用的区别3.底层工作原理(1) 寻找注入点(2) 注入点进行注入(一) 字段注入点 - AutowiredFieldElement(二) 方法注入点 - AutowiredMethodElement(3) 属性注入阶段寻找依赖Bean的核心代码逻辑详解4. static的字段或方法为什么不支持?5. @Qualifier 注解的使用6. 总结1. 可以定义的位置从源码的位置看, @Autowired可以定义在构造函数,方法,参数,属性字段,最常见的是定义在属性上

2022-02-23 11:29:07 781

原创 《Spring》第十三篇 DI自动注入之autowire装配模型

autowire装配模型的使用表示将属性注入的权利全部交给Spring来完成,包括找bean的权限, 开发者解放双手,无需手动的去指定。常用的模型有no,default,constructor,byName,byType五种形式, 默认是no模式

2022-02-19 13:59:34 219

原创 《Spring》第十二篇 推断构造方法机制

1. 简述与样例2. 源码解析3. 属性注入的时机4. 装配过程5. 属性精准映射赋值Spring中的一个bean,需要实例化得到一个对象,而实例化就需要用到构造方法而构造方法的个数又可以分为一个或者多个场景一个类只有一个构造方法:要么是无参的构造方法要么是有参的构造方法如果只有一个无参的构造方法,那么实例化就只能使用这个构造方法了; 如果只有一个有参的构造方法,那么实例化时能使用这个构造方法吗?要分情况讨论:...

2022-02-18 11:17:35 388

空空如也

空空如也

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

TA关注的人

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