<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[cccfire的博客]]></title><description><![CDATA[有人爱，有事做，有所期待...]]></description><link>https://blog.youkuaiyun.com/cccfire</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; cccfire]]></copyright><item><title><![CDATA[mysql的聚簇索引和非聚簇索引]]></title><link>https://blog.youkuaiyun.com/cccfire/article/details/145602879</link><guid>https://blog.youkuaiyun.com/cccfire/article/details/145602879</guid><author>cccfire</author><pubDate>Thu, 13 Feb 2025 01:58:35 +0800</pubDate><description><![CDATA[聚簇索引和非聚簇索引介绍]]></description><category></category></item><item><title><![CDATA[spring如何解决循环依赖？]]></title><link>https://blog.youkuaiyun.com/cccfire/article/details/145602800</link><guid>https://blog.youkuaiyun.com/cccfire/article/details/145602800</guid><author>cccfire</author><pubDate>Thu, 13 Feb 2025 01:36:21 +0800</pubDate><description><![CDATA[代码入口可以看spring源码getBean方法，大致流程。A类依赖B B又依赖A (A->B->A)]]></description><category></category></item><item><title><![CDATA[什么是死锁？死锁的必要条件是什么？如何避免与检测死锁？]]></title><link>https://blog.youkuaiyun.com/cccfire/article/details/145354282</link><guid>https://blog.youkuaiyun.com/cccfire/article/details/145354282</guid><author>cccfire</author><pubDate>Sat, 25 Jan 2025 11:49:48 +0800</pubDate><description><![CDATA[所谓死锁，就是在两个或多个并发进程中，如果每个进程持有某种资源而又都等待着别的进程释放它或它们现在保持着的资源，否则就不能向前推进，此时每个进程都占用了一定的资源但又都不能向前推进，称这一组进程产生了死锁。举个例子，如果此时有一个线程A持有a锁，按照先锁a再获得锁b的的顺序获得锁，而在此同时又有另外一个线程B，按照先锁b再锁a的顺序获得锁。]]></description><category></category></item><item><title><![CDATA[一篇实例分析让你了解mysql的隔离级别以及不同隔离级别可能产生的并发一致性问题。]]></title><link>https://blog.youkuaiyun.com/cccfire/article/details/145204807</link><guid>https://blog.youkuaiyun.com/cccfire/article/details/145204807</guid><author>cccfire</author><pubDate>Fri, 17 Jan 2025 23:17:13 +0800</pubDate><description><![CDATA[数据库隔离级别、数据库一致性问题、脏读、不可重复读、幻读]]></description><category></category></item><item><title><![CDATA[Spring源码学习-Resource]]></title><link>https://blog.youkuaiyun.com/cccfire/article/details/139666475</link><guid>https://blog.youkuaiyun.com/cccfire/article/details/139666475</guid><author>cccfire</author><pubDate>Thu, 13 Jun 2024 23:18:33 +0800</pubDate><description><![CDATA[Spring的Resource接口为资源访问提供了统一的接口，不同的实现类实现了从不同上下文获取资源。下面列举几个常用的Resource实现类。]]></description><category></category></item><item><title><![CDATA[Spring源码学习-DispatcherServlet注册]]></title><link>https://blog.youkuaiyun.com/cccfire/article/details/139665770</link><guid>https://blog.youkuaiyun.com/cccfire/article/details/139665770</guid><author>cccfire</author><pubDate>Thu, 13 Jun 2024 22:32:33 +0800</pubDate><description><![CDATA[暂时只关注Servlet的注册，Spring容器相关的以后介绍，createDispatcherServlet()方法创建了一个DispatcherServlet实例，然后通过servletContext.addServlet()方法完成DispatcherServlet的注册。首先调用父类的方法完成root WebApplicationContext的初始化，然后调用registerDispatcherServlet()方法完成DispatcherServlet的注册。]]></description><category></category></item><item><title><![CDATA[JVM运行时数据区 - 虚拟机栈]]></title><link>https://blog.youkuaiyun.com/cccfire/article/details/139456273</link><guid>https://blog.youkuaiyun.com/cccfire/article/details/139456273</guid><author>cccfire</author><pubDate>Wed, 05 Jun 2024 04:30:00 +0800</pubDate><description><![CDATA[虚拟机栈是线程执行Java程序时，处理Java方法中内容的内存区域。虚拟机栈也是线程私有的区域，每个Java方法被调用的时候，都会在虚拟机栈中创建出一个栈帧。如图，栈帧又由局部变量表、操作数栈、动态链接和方法返回四部分组成，有些虚拟机的栈帧还包括了一些附加信息。]]></description><category></category></item><item><title><![CDATA[JVM运行时数据区 - 本地方法栈]]></title><link>https://blog.youkuaiyun.com/cccfire/article/details/139456257</link><guid>https://blog.youkuaiyun.com/cccfire/article/details/139456257</guid><author>cccfire</author><pubDate>Wed, 05 Jun 2024 04:00:00 +0800</pubDate><description><![CDATA[在JVM规范中，本地方法也有和Java方法一样的方法调用栈，称为本地方法栈。如果本地方法栈在动态扩展的过程中无法申请到足够的内存，或者在创建线程时，无法申请到创建方法栈所需的内存，将会抛出OutMemoryError异常(系统分配给进程内存大小上限固定，当创建线程越多，单个线程所分配的内存就越少)。在JDK自带的方法库中常常看到被native修饰的方法，这些方法没有方法体实现，它们方法体通常是由C/C++语言实现，这种方法称为本地方法。本地方法可以通过本地方法接口来访问虚拟机内部的运行时数据区。]]></description><category></category></item><item><title><![CDATA[JVM运行时数据区-方法区]]></title><link>https://blog.youkuaiyun.com/cccfire/article/details/139456222</link><guid>https://blog.youkuaiyun.com/cccfire/article/details/139456222</guid><author>cccfire</author><pubDate>Tue, 04 Jun 2024 23:12:39 +0800</pubDate><description><![CDATA[JDK8以前，很多人把方法区称为永久代（Permanent Generation），实际上两者并不等价，这一说法是因为HotSpot虚拟机将垃圾收集分代设计将区域扩展到方法区，或者说永久代是方法区的实现。由于永久代更容易OOM，所以该设计在JDK7以后逐渐被淘汰，JDK1.7以后将字符串常量池和静态变量移入堆区，在JDK8以后，就不再有永久代说法，而是元空间（Meta Space）实现方法区。方法也是线程共享的区域，在JVM启动的时候被创建，并且，和堆区一样可以是逻辑上连续，物理上不连续的区域。]]></description><category></category></item><item><title><![CDATA[JVM运行数据区-Java堆]]></title><link>https://blog.youkuaiyun.com/cccfire/article/details/139456060</link><guid>https://blog.youkuaiyun.com/cccfire/article/details/139456060</guid><author>cccfire</author><pubDate>Tue, 04 Jun 2024 23:02:12 +0800</pubDate><description><![CDATA[伊甸区和S0、S1区默认为8:1:1，可通过-XX:SurvivorRatio参数修改，如-XX:SurvivorRatio=6，通过监测发现设置，以后并不是6:1:1，这是因为Java堆的内存分配策略，关闭内存分配策略，-XX:-UseAdaptiveSizePolicy。堆区（Heap区）是JVM运行时数据区占用内存最大的一块区域，每一个JVM进程只存在一个堆区，它在JVM启动时被创建，JVM规范中规定堆区可以是物理上不连续的内存，但必须是逻辑上连续的内存。-Xms:设置初始堆内存，如-Xms64m。]]></description><category></category></item><item><title><![CDATA[JVM运行时数据区 - 程序计数器]]></title><link>https://blog.youkuaiyun.com/cccfire/article/details/139399153</link><guid>https://blog.youkuaiyun.com/cccfire/article/details/139399153</guid><author>cccfire</author><pubDate>Sun, 02 Jun 2024 22:49:47 +0800</pubDate><description><![CDATA[如图，Java方法编译之后会生成JVM字节码指令，字节码指令并不能被CPU直接执行，需要通过字节码执行引擎解释成机器码执行，字节码执行引擎通过程序计数器中存储指令地址，找到对应的字节码指令，如果执行引擎中正在执行0对应的指令，程序计数器中则记录的下一条指令的地址就是3,紧接着就是4,5,6，如此推进。1、保证CPU的处理器切换线程执行时，等待的线程恢复执行之后能回到正确的位置继续执行(CPU的处理器在任一时间只能执行一个线程的指令，并且会不断切换线程执行)。]]></description><category></category></item><item><title><![CDATA[JVM类加载时机]]></title><link>https://blog.youkuaiyun.com/cccfire/article/details/139398924</link><guid>https://blog.youkuaiyun.com/cccfire/article/details/139398924</guid><author>cccfire</author><pubDate>Sun, 02 Jun 2024 22:35:49 +0800</pubDate><description><![CDATA[Java程序对类的使用分为主动引用和被动引用，主动引用时，会触发类的初始化（在JVM虚拟机规范中，对于类在什么时候加载并没有做限定，但是对类的初始化时机有规定），而被动引用则不会。8、当一个接口中定义了JDK8新加入的默认方法(被default关键字修饰的接口方法)时，如果有这个接口的实现类发生了初始化，那该接口要在其之前被初始化。3、访问类中final修饰的静态变量（常量在编译期间会存入常量池，本质上并没有直接引用到定义该常量的类，所以不会触发该类的初始化）。2、通过定义数组引用类，不会导致该类初始化。]]></description><category></category></item><item><title><![CDATA[JVM双亲委派模型]]></title><link>https://blog.youkuaiyun.com/cccfire/article/details/139398834</link><guid>https://blog.youkuaiyun.com/cccfire/article/details/139398834</guid><author>cccfire</author><pubDate>Sun, 02 Jun 2024 22:30:29 +0800</pubDate><description><![CDATA[在之前的JVM类加载器篇中说过，各个类加载器都有自己加载的范围，比如引导类加载器只加载Java核心库中的class如String，那如果用户自己建一个包名和类名与String相同的类，会不会被引导类加载器加载。可以通过如下代码测试，通过执行结果中的报错信息可以发现，JVM实际上加载了rt.jar中的String类，并未加载自定义的String，这个就是JVM的双亲委派模型解决的问题之一。运行结果。]]></description><category></category></item><item><title><![CDATA[JVM类加载器]]></title><link>https://blog.youkuaiyun.com/cccfire/article/details/139398705</link><guid>https://blog.youkuaiyun.com/cccfire/article/details/139398705</guid><author>cccfire</author><pubDate>Sun, 02 Jun 2024 22:24:04 +0800</pubDate><description><![CDATA[隔离类，如类路径冲突。防反编译加密Class文件。扩展类的加载源。自定义实现类加载器可以通过继承java.lang.ClassLoader并重写loadClas()方法或者实现findClass()（推荐）方法，如下代码就是加载指定目录class的简单实现。// 指定目录@Override// class文件路径is.read(b);]]></description><category></category></item><item><title><![CDATA[JVM类加载过程]]></title><link>https://blog.youkuaiyun.com/cccfire/article/details/139398601</link><guid>https://blog.youkuaiyun.com/cccfire/article/details/139398601</guid><author>cccfire</author><pubDate>Sun, 02 Jun 2024 22:18:46 +0800</pubDate><description><![CDATA[在Java虚拟机规范中，把描述类的数据从class文件加载到内存，并对数据进行校验、转换解析和初始化，最终形成可以被虚拟机直接使用的java.lang.Class对象，这个过程被称作类加载过程。一个类在整个虚拟机周期内会经历如下图的阶段，从加载到初始化就是类加载过程。]]></description><category></category></item><item><title><![CDATA[单点登录开源框架cas7.0.x学习springboot+gradle+jdk21]]></title><link>https://blog.youkuaiyun.com/cccfire/article/details/139180344</link><guid>https://blog.youkuaiyun.com/cccfire/article/details/139180344</guid><author>cccfire</author><pubDate>Fri, 24 May 2024 17:37:29 +0800</pubDate><description><![CDATA[如何基于springboot构建最新版cas源码]]></description><category></category></item><item><title><![CDATA[登录github突然出现Two-factor authentication怎么办？]]></title><link>https://blog.youkuaiyun.com/cccfire/article/details/137912424</link><guid>https://blog.youkuaiyun.com/cccfire/article/details/137912424</guid><author>cccfire</author><pubDate>Thu, 18 Apr 2024 10:57:50 +0800</pubDate><description><![CDATA[今天想登录github下载项目，输入用户名密码认证之后竟然弹出来了Two-factor authentication，像下图，我只记得之前好像开启过这玩意，但是不知道哪里找这个code了。在你的iphone里面搜索密码。然后找到github网页，就能看到验证码了。]]></description><category></category></item><item><title><![CDATA[Exchanger 怎么用J.U.C]]></title><link>https://blog.youkuaiyun.com/cccfire/article/details/137337915</link><guid>https://blog.youkuaiyun.com/cccfire/article/details/137337915</guid><author>cccfire</author><pubDate>Wed, 03 Apr 2024 11:26:10 +0800</pubDate><description><![CDATA[Exchanger通常用来解决以下类似场景的问题，如下：两个线程间需要交换数据的问题，在多线程编程中，经常会有这样的场景：两个线程各自持有一些数据，并且需要在某个点上交换这些数据，Exchanger类提供了一个简单、高效的机制来实现这种数据交换。]]></description><category></category></item><item><title><![CDATA[Spring中最常用的11个扩展点]]></title><link>https://blog.youkuaiyun.com/cccfire/article/details/137264774</link><guid>https://blog.youkuaiyun.com/cccfire/article/details/137264774</guid><author>cccfire</author><pubDate>Tue, 02 Apr 2024 11:54:05 +0800</pubDate><description><![CDATA[我们一说到spring，可能第一个想到的是 IOC（控制反转） 和 AOP（面向切面编程）。没错，它们是spring的基石，得益于它们的优秀设计，使得spring能够从众多优秀框架中脱颖而出。除此之外，我们在使用spring的过程中，有没有发现它的扩展能力非常强。由于这个优势的存在，让spring拥有强大的包容能力，让很多第三方应用能够轻松投入spring的怀抱。比如：rocketmq、mybatis、redis等。]]></description><category></category></item><item><title><![CDATA[(n - 1) & hash 为什么等于hash % n]]></title><link>https://blog.youkuaiyun.com/cccfire/article/details/137264487</link><guid>https://blog.youkuaiyun.com/cccfire/article/details/137264487</guid><author>cccfire</author><pubDate>Tue, 02 Apr 2024 11:44:08 +0800</pubDate><description><![CDATA[为了能让 HashMap 存取高效，尽量较少碰撞，也就是要尽量把数据分配均匀，Hash 值的范围值-2147483648到2147483647，前后加起来大概40亿的映射空间，只要哈希函数映射得比较均匀松散，一般应用是很难出现碰撞的。但问题是一个40亿长度的数组，内存是放不下的。所以这个散列值是不能直接拿来用的。用之前还要先做对数组的长度取模运算，得到的余数才能用来要存放的位置也就是对应的数组下标。这个数组下标的计算方法是“ (n - 1) & hash”。（n代表数组长度）。]]></description><category></category></item></channel></rss>