<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[regrethh的博客]]></title><description><![CDATA[一个小兵的成长之路]]></description><link>https://blog.youkuaiyun.com/regrethh</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; regrethh]]></copyright><item><title><![CDATA[fastjson 安全漏洞]]></title><link>https://blog.youkuaiyun.com/regrethh/article/details/107381977</link><guid>https://blog.youkuaiyun.com/regrethh/article/details/107381977</guid><author>regrethh</author><pubDate>Thu, 16 Jul 2020 14:20:51 +0800</pubDate><description><![CDATA[本文转载自微信公众号Hollis，作者Hollis。如果有侵权，请联系我，立马删除。
fastjson大家一定都不陌生，这是阿里巴巴的开源一个JSON解析库，通常被用于将Java Bean和JSON 字符串之间进行转换。
前段时间，fastjson被爆出过多次存在漏洞，很多文章报道了这件事儿，并且给出了升级建议。
但是作为一个开发者，我更关注的是他为什么会频繁被爆漏洞？于是我带着疑惑，去看了下fastjson的releaseNote以及部分源代码。
最终发现，这其实和fastjson中的一个AutoType]]></description><category></category></item><item><title><![CDATA[JAVA 序列化]]></title><link>https://blog.youkuaiyun.com/regrethh/article/details/107370852</link><guid>https://blog.youkuaiyun.com/regrethh/article/details/107370852</guid><author>regrethh</author><pubDate>Wed, 15 Jul 2020 21:31:58 +0800</pubDate><description><![CDATA[JAVA 序列化
什么是序列化

序列化:把对象转换为字节序列的过程称为对象的序列化。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。

​		再来看看Java中的序列化。
Serializable
public interface Serializable {
}

​	Java中定义了一个空的接口。实现该空接口，即可实现序列化。
​	Java中有ObjectOutputStream和ObjectInputStream。
先定义一个Student类
public class Student  {]]></description><category></category></item><item><title><![CDATA[Dubbo SPI]]></title><link>https://blog.youkuaiyun.com/regrethh/article/details/106080772</link><guid>https://blog.youkuaiyun.com/regrethh/article/details/106080772</guid><author>regrethh</author><pubDate>Tue, 12 May 2020 17:19:56 +0800</pubDate><description><![CDATA[Dubbo SPI
什么是SPI？
​	SPI 全称为 Service Provider Interface，是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中，并由服务加载器读取配置文件，加载实现类。这样可以在运行时，动态为接口替换实现类。
Java SPI
public interface Color {
    void color();
}

public class Yellow implements Color {
    @Override
    public void ]]></description><category></category></item><item><title><![CDATA[Dubbo源码（一）服务暴露]]></title><link>https://blog.youkuaiyun.com/regrethh/article/details/105977236</link><guid>https://blog.youkuaiyun.com/regrethh/article/details/105977236</guid><author>regrethh</author><pubDate>Thu, 07 May 2020 17:24:47 +0800</pubDate><description><![CDATA[Dubbo源码（一）服务暴露
版本介绍
​	从官网上直接摘抄下来的。源码统一为2.6.X版本。




版本
重要功能
升级建议





1
2.6.x
bugfix
建议持续升级最新版本，所有版本生产可用


2
2.5.x
停止维护
建议升级最新 2.6.x 版本


3
2.4.x 及之前
停止维护
建议升级最新 2.6.x 版本


背景
http://dubbo.apache.org/...]]></description><category></category></item><item><title><![CDATA[Spring源码（二）bean的创建]]></title><link>https://blog.youkuaiyun.com/regrethh/article/details/105769582</link><guid>https://blog.youkuaiyun.com/regrethh/article/details/105769582</guid><author>regrethh</author><pubDate>Sun, 26 Apr 2020 15:14:14 +0800</pubDate><description><![CDATA[Spring源码（二）bean的创建
​	怎么去获取一个Spring Bean？
​	通过BeanFactory定义的getBean()方法，就可以从容器中拿到这个bean的实例。
​	所以，我们从getBean方法为入口，看看Spring在里面做了些什么操作。
//返回指定的bean实例
Object getBean(String name) throws BeansException;
//返...]]></description><category></category></item><item><title><![CDATA[Spring源码（一）bean的装载]]></title><link>https://blog.youkuaiyun.com/regrethh/article/details/105731898</link><guid>https://blog.youkuaiyun.com/regrethh/article/details/105731898</guid><author>regrethh</author><pubDate>Fri, 24 Apr 2020 15:23:15 +0800</pubDate><description><![CDATA[Spring源码（一）bean的装载
Spring源码均基于5.0.2
一.DefaultListableBeanFactory
​	先来看看JavaDoc定义

ListableBeanFactory和BeanDefinitionRegistry接口的默认实现：一个基于bean定义对象的完整的bean工厂。
典型的用法是先注册所有的Bean定义（可能是从Bean定义文件中读取），然后再访问Bea...]]></description><category></category></item><item><title><![CDATA[SpringApplication-准备(二)]]></title><link>https://blog.youkuaiyun.com/regrethh/article/details/105660520</link><guid>https://blog.youkuaiyun.com/regrethh/article/details/105660520</guid><author>regrethh</author><pubDate>Tue, 21 Apr 2020 16:06:55 +0800</pubDate><description><![CDATA[SpringApplication-准备(二)
​	接着看SpringApplication.run(args)方法
public ConfigurableApplicationContext run(String... args) {
  //一个用来记录任务耗时的类。注意：非线程安全，也不用于生产。
   StopWatch stopWatch = new StopWatch();
   st...]]></description><category></category></item><item><title><![CDATA[SpringApplication-构造(一)]]></title><link>https://blog.youkuaiyun.com/regrethh/article/details/105628864</link><guid>https://blog.youkuaiyun.com/regrethh/article/details/105628864</guid><author>regrethh</author><pubDate>Mon, 20 Apr 2020 10:29:00 +0800</pubDate><description><![CDATA[SpringApplication-构造(一)
public class BootStrapApplication {
    public static void main(String[] args) {
        SpringApplication.run(BootStrapApplication.class, args);
    }
}

public static Configu...]]></description><category></category></item><item><title><![CDATA[Spring Boot自动装配（三）]]></title><link>https://blog.youkuaiyun.com/regrethh/article/details/105563218</link><guid>https://blog.youkuaiyun.com/regrethh/article/details/105563218</guid><author>regrethh</author><pubDate>Thu, 16 Apr 2020 17:35:27 +0800</pubDate><description><![CDATA[Spring Boot自动装配（三）
​	在EnableAutoConfiguration类中，还存在一个注解AutoConfigurationPackage
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.R...]]></description><category></category></item><item><title><![CDATA[SpringBoot自动装配（二）]]></title><link>https://blog.youkuaiyun.com/regrethh/article/details/105539769</link><guid>https://blog.youkuaiyun.com/regrethh/article/details/105539769</guid><author>regrethh</author><pubDate>Wed, 15 Apr 2020 17:22:33 +0800</pubDate><description><![CDATA[SpringBoot自动装配（二）
​	上文写到，最后会配置一个监听器，用于记录自动装配的条件评估详情。现在我们自定义一个监听器，去测试下。首先需要实现一个AutoConfigurationImportListener接口。
public class DefaultAutoConfigurationImportListener implements AutoConfigurationImportL...]]></description><category></category></item><item><title><![CDATA[Spring Boot自定义@Enable模块驱动]]></title><link>https://blog.youkuaiyun.com/regrethh/article/details/105517188</link><guid>https://blog.youkuaiyun.com/regrethh/article/details/105517188</guid><author>regrethh</author><pubDate>Tue, 14 Apr 2020 17:42:30 +0800</pubDate><description><![CDATA[Spring Boot自定义@Enable模块驱动
注解驱动
​	先看下Spring Framework已有的实现，@EnableWebMvc
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({DelegatingWebMvcConfiguration.class})
publi...]]></description><category></category></item><item><title><![CDATA[Spring Boot自动装配（一）]]></title><link>https://blog.youkuaiyun.com/regrethh/article/details/105493992</link><guid>https://blog.youkuaiyun.com/regrethh/article/details/105493992</guid><author>regrethh</author><pubDate>Mon, 13 Apr 2020 17:49:16 +0800</pubDate><description><![CDATA[Spring Boot自动装配（一）
注：基于SpringBoot2.x版本以上
@EnableAutoConfiguration
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigur...]]></description><category></category></item><item><title><![CDATA[Java并发源码：BlockingQueue]]></title><link>https://blog.youkuaiyun.com/regrethh/article/details/103806214</link><guid>https://blog.youkuaiyun.com/regrethh/article/details/103806214</guid><author>regrethh</author><pubDate>Thu, 02 Jan 2020 16:11:01 +0800</pubDate><description><![CDATA[Java并发源码：BlockingQueue
​	阻塞队列是一个支持阻塞的插入方法和阻塞的移除方法的队列。




方法
抛出异常
返回特殊值
一直阻塞
超时退出




插入方法
add(e)
offer(e)
put(e)
offer(e,time,unit)


移除方法
remove(e)
poll()
take()
poll(time,unit)


检查方法
element()
pee...]]></description><category></category></item><item><title><![CDATA[Java并发源码：ConcurrentHashMap]]></title><link>https://blog.youkuaiyun.com/regrethh/article/details/103783503</link><guid>https://blog.youkuaiyun.com/regrethh/article/details/103783503</guid><author>regrethh</author><pubDate>Tue, 31 Dec 2019 15:30:49 +0800</pubDate><description><![CDATA[Java并发源码：ConcurrentHashMap
为什么要使用ConcurrentHashMap

不安全的HashMap
效率低下的HashTable
ConcurrentHashMap的锁分段技术可以有效提升并发访问率

ConcurrentHashMap的结构
​	ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成的。
​	Jdk1.7 Segm...]]></description><category></category></item><item><title><![CDATA[java并发源码：Condition]]></title><link>https://blog.youkuaiyun.com/regrethh/article/details/103699432</link><guid>https://blog.youkuaiyun.com/regrethh/article/details/103699432</guid><author>regrethh</author><pubDate>Wed, 25 Dec 2019 15:05:05 +0800</pubDate><description><![CDATA[java并发源码：Condition
比对Object的监视器方法和Condition接口




对比项
Object
Condition




前置条件
获取对象的锁
调用Lock.lock()获取锁                                                                                                 ...]]></description><category></category></item><item><title><![CDATA[java并发源码：ReentrantReadWriteLock]]></title><link>https://blog.youkuaiyun.com/regrethh/article/details/103667528</link><guid>https://blog.youkuaiyun.com/regrethh/article/details/103667528</guid><author>regrethh</author><pubDate>Mon, 23 Dec 2019 16:05:11 +0800</pubDate><description><![CDATA[java并发源码：ReentrantReadWriteLock
结构


可见ReentrantReadWriteLock实现了ReadWriteLock接口。
ReadWriteLock接口定义了两个接口:
Lock readLock()
Lock writeLock()
​	ReentrantLock是排他锁，在同一时刻只允许一个线程进行访问，而读写锁在同一时刻可以允许多个线程访问。但是在写线...]]></description><category></category></item><item><title><![CDATA[java并发源码：ReentrantLock]]></title><link>https://blog.youkuaiyun.com/regrethh/article/details/103509133</link><guid>https://blog.youkuaiyun.com/regrethh/article/details/103509133</guid><author>regrethh</author><pubDate>Thu, 12 Dec 2019 14:57:43 +0800</pubDate><description><![CDATA[java并发源码：ReentrantLock
结构

可见ReentrantLock实现了Lock接口。
lock
lock接口定义了五个方法。
void lock();：获取锁。
void lockInterruptibly() throws InterruptedException;：可中断的获取锁，该方法会响应中断。
boolean tryLock();：尝试非阻塞的获取锁。
boolean...]]></description><category></category></item><item><title><![CDATA[java并发源码：Synchronized]]></title><link>https://blog.youkuaiyun.com/regrethh/article/details/103488909</link><guid>https://blog.youkuaiyun.com/regrethh/article/details/103488909</guid><author>regrethh</author><pubDate>Wed, 11 Dec 2019 11:06:00 +0800</pubDate><description><![CDATA[java并发源码：Synchronized
synchronized加锁方式：

修饰实例方法：锁是当前对象。
修饰静态方法：锁是当前类的class对象。
修饰代码块：锁是synchronized括号里配置的对象。

​	JVM基于进入和退出Monitor对象来实现方法同步和代码块同步的。代码块同步是用monitorenter 和monitorexit指令实现的。
 public void tes...]]></description><category></category></item><item><title><![CDATA[java并发源码：volatile]]></title><link>https://blog.youkuaiyun.com/regrethh/article/details/103477905</link><guid>https://blog.youkuaiyun.com/regrethh/article/details/103477905</guid><author>regrethh</author><pubDate>Tue, 10 Dec 2019 16:25:12 +0800</pubDate><description><![CDATA[java并发源码：volatile
volatile的定义：
​	java编程语言运行线程访问共享变量，为了确保共享变量能被准确和一致地更新，线程应该确保通过排它锁单独获得这个变量。如果一个变量被声明成volatile，java线程内存模型确保所有线程看到这个变量的值是一致的。（可见性）
volatile的作用：
1.保证变量在多线程中的可见性
​	为了提高处理速度，处理器不直接和内存进行通信，而...]]></description><category></category></item><item><title><![CDATA[java并发源码：AbstractQueuedSynchronizer]]></title><link>https://blog.youkuaiyun.com/regrethh/article/details/103462895</link><guid>https://blog.youkuaiyun.com/regrethh/article/details/103462895</guid><author>regrethh</author><pubDate>Mon, 09 Dec 2019 18:29:32 +0800</pubDate><description><![CDATA[java并发源码：AbstractQueuedSynchronizer
一、简介
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pEGdDFSw-1575887227561)
​	AQS（队列同步器）是用来构建锁或者其它同步组件的基础框架，它使用了一个int成员变量来标识同步状态，通过内置的FIFO队列来完成资源获取线程的排队工作。
​	AQS面向的是锁的实现者，它...]]></description><category></category></item></channel></rss>