<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[A___B___C的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/A___B___C</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; A___B___C]]></copyright><item><title><![CDATA[SpringBoot 整合 minio 进行文件上传]]></title><link>https://blog.youkuaiyun.com/A___B___C/article/details/116604746</link><guid>https://blog.youkuaiyun.com/A___B___C/article/details/116604746</guid><author>A___B___C</author><pubDate>Mon, 10 May 2021 18:30:24 +0800</pubDate><description><![CDATA[1、添加minio依赖


&lt;dependency&gt;
    &lt;groupId&gt;io.minio&lt;/groupId&gt;
    &lt;artifactId&gt;minio&lt;/artifactId&gt;
    &lt;version&gt;8.2.1&lt;/version&gt;
&lt;/dependency&gt;

2、添加配置文件



3、配置文件导入


import lombok.Data;
import org.springframework.]]></description><category></category></item><item><title><![CDATA[深入理解ConcurrentHashMap原理分析以及线程安全性问题]]></title><link>https://blog.youkuaiyun.com/A___B___C/article/details/114268627</link><guid>https://blog.youkuaiyun.com/A___B___C/article/details/114268627</guid><author>A___B___C</author><pubDate>Mon, 01 Mar 2021 18:08:44 +0800</pubDate><description><![CDATA[在之前的文章提到ConcurrentHashMap是一个线程安全的，那么我么看一下ConcurrentHashMap如何进行操作的。

ConcurrentHashMap与HashTable区别？
HashTable
put()源代码

我们来看一下put 操作：
方法体 被 同步锁标记，由于同步锁的特性，其他线程将会排队进行等待处理。
除此之外，对传入的key 值进行了一个判断空值逻辑。【PS：HashMap 是允许key值为空的】


**ConcurrentHashMap **
分段锁技术：Concu]]></description><category></category></item><item><title><![CDATA[对比 Hashtable、HashMap、TreeMap 的区别联系以及适用场景]]></title><link>https://blog.youkuaiyun.com/A___B___C/article/details/114265628</link><guid>https://blog.youkuaiyun.com/A___B___C/article/details/114265628</guid><author>A___B___C</author><pubDate>Mon, 01 Mar 2021 16:30:59 +0800</pubDate><description><![CDATA[①基本理解

Hashtable、Hashmap、Treemap都是最常见的一些Map实现，是以键值对的形式存储和操作数据的容器类型。

Hashtable是Java类库提供的一个哈希实现，本身是同步的，不支持null键和null值，由于同步导致性能开销，所以已经很少被推荐使用。

HashMap是应用更加广泛的哈希表实现，行为上大致与HashTable一致，主要区别在于HashMap不是同步的，支持null键和null值等。通常情况下HashMap进行get和put操作可以达到常数时间的性能，所以它是绝大]]></description><category></category></item><item><title><![CDATA[对比Vector、ArrayList、LinkedList有何区别]]></title><link>https://blog.youkuaiyun.com/A___B___C/article/details/114264399</link><guid>https://blog.youkuaiyun.com/A___B___C/article/details/114264399</guid><author>A___B___C</author><pubDate>Mon, 01 Mar 2021 15:49:26 +0800</pubDate><description><![CDATA[这三者都是实现集合框架中的List，也就是所谓的有序集合，因此具体功能也比较近似，比如都提供按照位置进行定位、添加或者删除的操作，都提供迭代器以遍历其内容等。但因为具体的设计区别，在行为、性能、线程安全等方面，表现又有很大不同。

  Verctor 是 Java 早期提供的线程安全的动态数组，如果不需要线程安全，并不建议选择，毕竟同步是有额外开销的。Vector 内部是使用对象数组来保存数据，可以根据需要自动的增加容量，当数组已满时，会创建新的数组，并拷贝原有数组数据。

  ArrayList 是应用更]]></description><category></category></item><item><title><![CDATA[Java基础之int和Integer有什么区别]]></title><link>https://blog.youkuaiyun.com/A___B___C/article/details/114142052</link><guid>https://blog.youkuaiyun.com/A___B___C/article/details/114142052</guid><author>A___B___C</author><pubDate>Fri, 26 Feb 2021 17:13:51 +0800</pubDate><description><![CDATA[1 Java两种数据类型
1.1 Java两种数据类型分类
（1）基本数据类型，分为boolean、byte、int、char、long、short、double、float；
（2）引用数据类型 ，分为数组、类、接口。

1.2 Java为每个基本数据类型提供了封装类
为了编程的方便还是引入了基本数据类型，但是为了能够将这些基本数据类型当成对象操作，Java为每 一个基本数据类型都引入了对应的包装类型（wrapper class），int的包装类就是Integer，从Java 5开始引入了自动装箱/拆箱机]]></description><category></category></item><item><title><![CDATA[ASM原理详解]]></title><link>https://blog.youkuaiyun.com/A___B___C/article/details/114141923</link><guid>https://blog.youkuaiyun.com/A___B___C/article/details/114141923</guid><author>A___B___C</author><pubDate>Fri, 26 Feb 2021 17:12:04 +0800</pubDate><description><![CDATA[一、什么是ASM
　　ASM是一个java字节码操纵框架，它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class文件，也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class文件里，这些类文件拥有足够的元数据来解析类中的所有元素：类名称、方法、属性以及 Java 字节码（指令）。ASM从类文件中读入信息后，能够改变类行为，分析类信息，甚至能够根据用户要求生成新类。asm字节码增强技术主要是用来反射的时候提升性能的，如果单纯.]]></description><category></category></item><item><title><![CDATA[动态代理是基于什么原理]]></title><link>https://blog.youkuaiyun.com/A___B___C/article/details/114141858</link><guid>https://blog.youkuaiyun.com/A___B___C/article/details/114141858</guid><author>A___B___C</author><pubDate>Fri, 26 Feb 2021 17:10:58 +0800</pubDate><description><![CDATA[代理模式:通过代理静默的解决一些与业务无关的问题,例如远程,安全,事物,日志,资源关闭,...让应用开发者可以只关心自身业务.

静态代理:事先写好代码类,可以手工编写,也可以用工具生成.缺点是每个业务类都要有一个对应代理类,非常不灵活.

动态代理:运行时自动生成代理对象.缺点是生成代理对象和调用代理对象都要额外花费时间,

JDK动态代理:基于java反射机制实现,必须要实现了接口的业务类才能用这种办法生成代理对象.新版本也开始结合ASM机制.

cglib动态代理:基于ASM机制实现,通过生成业务类的]]></description><category></category></item><item><title><![CDATA[千万级数据量表，快速添加索引思路！]]></title><link>https://blog.youkuaiyun.com/A___B___C/article/details/114141088</link><guid>https://blog.youkuaiyun.com/A___B___C/article/details/114141088</guid><author>A___B___C</author><pubDate>Fri, 26 Feb 2021 16:58:58 +0800</pubDate><description><![CDATA[前言

增加字段相信大家应该都不陌生，随手就可以写出来，给 MySQL 一张表加字段执行如下 sql 就可以了：


ALTERTABLEtbl_tplADDtitle(255)DEFAULT''COMMENT'标题'AFTERid;


但是线上的一张表如果数据量很大呢，执行加字段操作就会锁表，这个过程可能需要很长时间甚至导致服务崩溃，那么这样操作就很有风险了。

给 MySQL 大表加字段的思路

① 创建一个临时的新表，首先复制旧表的结构（包含索引）


createtable...]]></description><category></category></item><item><title><![CDATA[String,StringBuffer与StringBuilder的区别]]></title><link>https://blog.youkuaiyun.com/A___B___C/article/details/114140719</link><guid>https://blog.youkuaiyun.com/A___B___C/article/details/114140719</guid><author>A___B___C</author><pubDate>Fri, 26 Feb 2021 16:53:38 +0800</pubDate><description><![CDATA[一、Java String 类——String字符串常量

字符串广泛应用在Java 编程中，在 Java 中字符串属于对象，Java 提供了String 类来创建和操作字符串。

需要注意的是，String的值是不可变的，这就导致每次对String的操作都会生成新的String对象，这样不仅效率低下，而且大量浪费有限的内存空间。我们来看一下这张对String操作时内存变化的图：



我们可以看到，初始String值为“hello”，然后在这个字符串后面加上新的字符串“world”，这个过程是需要重新..]]></description><category></category></item><item><title><![CDATA[谈谈final,finally,finalize的区别]]></title><link>https://blog.youkuaiyun.com/A___B___C/article/details/114029246</link><guid>https://blog.youkuaiyun.com/A___B___C/article/details/114029246</guid><author>A___B___C</author><pubDate>Wed, 24 Feb 2021 17:15:19 +0800</pubDate><description><![CDATA[1. final

　　在java中，final可以用来修饰类，方法和变量（成员变量或局部变量）。下面将对其详细介绍。

1.1 修饰类

　　当用final修饰类的时，表明该类不能被其他类所继承。当我们需要让一个类永远不被继承，此时就可以用final修饰，但要注意：

final类中所有的成员方法都会隐式的定义为final方法。

1.2 修饰方法

使用final方法的原因主要有两个：

　　(1) 把方法锁定，以防止继承类对其进行更改。

　　(2) 效率，在早期的java版本中，会将final方法.]]></description><category></category></item><item><title><![CDATA[谈谈你对java平台的理解？]]></title><link>https://blog.youkuaiyun.com/A___B___C/article/details/114029176</link><guid>https://blog.youkuaiyun.com/A___B___C/article/details/114029176</guid><author>A___B___C</author><pubDate>Wed, 24 Feb 2021 17:14:23 +0800</pubDate><description><![CDATA[问题：谈谈你对java平台的理解？java是解释执行，这句话对吗？

典型回答：java本身是一种面向对象的语言，具有很好的跨平台的能力，能够做到“write once ,run anywhere”。另外就是GC机制，java通过垃圾回收器回收分配内存，程序员无需自己操心内寸的回收问题。

我们日常会接触到jre和jdk。jre是java运行环境，包含了jvm和java类库等。jdk则是在jre的基础上提供了更多的工具，比如编译器，和一些诊断工具等。

  java是解释执行，这句话不是很准...]]></description><category></category></item><item><title><![CDATA[Exception和Error有什么区别]]></title><link>https://blog.youkuaiyun.com/A___B___C/article/details/114028200</link><guid>https://blog.youkuaiyun.com/A___B___C/article/details/114028200</guid><author>A___B___C</author><pubDate>Wed, 24 Feb 2021 17:00:51 +0800</pubDate><description><![CDATA[基本概念

首先Exception和Error都是继承于Throwable 类，在 Java 中只有 Throwable 类型的实例才可以被抛出（throw）或者捕获（catch），它是异常处理机制的基本组成类型。

Exception和Error体现了JAVA这门语言对于异常处理的两种方式。

Exception是java程序运行中可预料的异常情况，咱们可以获取到这种异常，并且对这种异常进行业务外的处理。

Error是java程序运行中不可预料的异常情况，这种异常发生以后，会直接导致JVM不...]]></description><category></category></item><item><title><![CDATA[linux查看java堆栈]]></title><link>https://blog.youkuaiyun.com/A___B___C/article/details/109331996</link><guid>https://blog.youkuaiyun.com/A___B___C/article/details/109331996</guid><author>A___B___C</author><pubDate>Wed, 28 Oct 2020 15:02:54 +0800</pubDate><description><![CDATA[1、查看JAVA进程JVM参数

jinfo -flags pid(进程号)
-XX:CICompilerCount=2 最大的并行编译数
-XX:InitialHeapSize=16777216 JVM 的初始堆内存大小
-XX:MaxHeapSize=257949696 JVM 的最大堆内存大小
-XX:MaxNewSize=85983232
-XX:MinHeapDeltaBytes=196608
-XX:NewSize=5570560
-XX:OldSize=11206656


2、JVM 查看.]]></description><category></category></item><item><title><![CDATA[springBoot使用guava的令牌桶机制实现限流]]></title><link>https://blog.youkuaiyun.com/A___B___C/article/details/108278717</link><guid>https://blog.youkuaiyun.com/A___B___C/article/details/108278717</guid><author>A___B___C</author><pubDate>Fri, 28 Aug 2020 15:26:34 +0800</pubDate><description><![CDATA[guava是谷歌提供的一RateLimiter，指定一个qps的值，请求来需要acquire获取令牌，直到令牌重新填充才得到放行。tryAcquire方法的话，可以指定一个等待时间，并返回一个Boolea值。套框架，我们这里需要用到的是它的限流器：不足之处:所有的请求进来都是调用acquire。无法根据ip或者其他的类型关键字来区分。所以我们引入了缓存，类似HashMap，针对不同的关键字(本文使用方法名)生成不同的限流器。

1、引入配置依赖

低版本没有RateLimiter方法，版本不对时...]]></description><category></category></item><item><title><![CDATA[SpringBoot使用redis+lua实现限流或重复提交]]></title><link>https://blog.youkuaiyun.com/A___B___C/article/details/108275800</link><guid>https://blog.youkuaiyun.com/A___B___C/article/details/108275800</guid><author>A___B___C</author><pubDate>Fri, 28 Aug 2020 11:20:55 +0800</pubDate><description><![CDATA[本文主要演示了 Spring Boot 项目如何通过 AOP 结合 Redis + Lua 脚本实现分布式限流，旨在保护 API 被恶意频繁访问的问题;


 1、redis 配置文件


@Configuration
public class RedisConfig {
    @Bean
    public RedisScript&lt;Long&gt; limitRedisScript() {
        DefaultRedisScript redisScript = new Defau...]]></description><category></category></item><item><title><![CDATA[springboot实现logback日志]]></title><link>https://blog.youkuaiyun.com/A___B___C/article/details/107973936</link><guid>https://blog.youkuaiyun.com/A___B___C/article/details/107973936</guid><author>A___B___C</author><pubDate>Thu, 13 Aug 2020 10:27:54 +0800</pubDate><description><![CDATA[在resources目录下创建logback.xml日志

具体配置内容如下：


&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;configuration&gt;
    &lt;!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,%i索引【从数字0开始递增】,,, --&gt;
    &lt;!-- appender是configuration的子节点，是负责写日志的组件。 --&gt;
    &lt;!-- ConsoleA]]></description><category></category></item><item><title><![CDATA[SpringBoot实现简单上传功能]]></title><link>https://blog.youkuaiyun.com/A___B___C/article/details/107971659</link><guid>https://blog.youkuaiyun.com/A___B___C/article/details/107971659</guid><author>A___B___C</author><pubDate>Thu, 13 Aug 2020 09:04:20 +0800</pubDate><description><![CDATA[# Getting Started
# spring boot 实现简单上传
1、pom.xml文件添加依赖
  &lt;dependency&gt;
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
            &lt;artifactId&gt;spring-boot-starter-thymeleaf&lt;/artifactId&gt;
   &lt;/dependency&gt;
2、yml文件添加.]]></description><category></category></item><item><title><![CDATA[线上服务器cpu飙升问题排查]]></title><link>https://blog.youkuaiyun.com/A___B___C/article/details/107769289</link><guid>https://blog.youkuaiyun.com/A___B___C/article/details/107769289</guid><author>A___B___C</author><pubDate>Mon, 03 Aug 2020 17:39:48 +0800</pubDate><description><![CDATA[今天实施突然反馈说医院线上的cpu一直在报警，报警阈值是cpu占用率超过80%并持续达到五分钟，然后我远程过去查看cpu使用情况发现cpu使用率一直100%。下面是我排查此次cpu飙升问题的步骤。

1、top 查看 cpu使用情况 图中是重启后的占用率仅供参考



2、top -c 查看cpu情况 按照比例倒序找到占用率最好的进程的PID

3、ps -mp [步骤2中查到的PID] -o THREAD,tid,time 产看改进程下的线程TID (tid情况仅供参考)



4、printf "%x.]]></description><category></category></item><item><title><![CDATA[mysql数据库慢sql排查]]></title><link>https://blog.youkuaiyun.com/A___B___C/article/details/107747253</link><guid>https://blog.youkuaiyun.com/A___B___C/article/details/107747253</guid><author>A___B___C</author><pubDate>Sun, 02 Aug 2020 17:33:59 +0800</pubDate><description><![CDATA[目的：记录查询超过200ms的sql进行统计，通过结果进行对应的优化。

默认情况下，MySQL数据库并不启动慢查询日志，需要手动开启配置。如果不是调优需要的话，一般不建议启动该参数，因为开启慢查询日志会或多或少带来一定的性能影响。

操纵：开启配置

1、慢sql查询是否开启

SHOW VARIABLES LIKE 'log_slow_queries'; 开启 ON 关闭OFF 默认是OFF

2、查看慢sql统计时间

show variables like '%long_query_time%'..]]></description><category></category></item><item><title><![CDATA[记一次医院线上问题慢慢慢问题排查解决]]></title><link>https://blog.youkuaiyun.com/A___B___C/article/details/107693948</link><guid>https://blog.youkuaiyun.com/A___B___C/article/details/107693948</guid><author>A___B___C</author><pubDate>Thu, 30 Jul 2020 17:24:27 +0800</pubDate><description><![CDATA[故事的开始是实施小老弟把医院的数据库私自做迁移，然后就崩了，之后去重新弄好了数据库，并去医院赔礼道歉，毕竟还有一大笔尾款未到账，然后就是医院不停的喊系统慢慢慢，下面就是这次慢慢慢问题的解决。

   打开系统日志发现没有打印数据库日志，因为医院做了负载均衡，我们就一台一台的进行了添加数据库日志的配置参数，


  logging.level.***.mysqlmapper=debug

  然后发现了会在同一时间前端发送了大量的请求去访问同一个接口，导致数据库压力增大。影响其他业务...]]></description><category></category></item></channel></rss>