<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Mutou_ren的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Mutou_ren</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Mutou_ren]]></copyright><item><title><![CDATA[CAS]]></title><link>https://blog.youkuaiyun.com/Mutou_ren/article/details/112275958</link><guid>https://blog.youkuaiyun.com/Mutou_ren/article/details/112275958</guid><author>Mutou_ren</author><pubDate>Wed, 06 Jan 2021 15:23:48 +0800</pubDate><description><![CDATA[https://www.zhihu.com/question/65372648
https://zhuanlan.zhihu.com/p/243739776

]]></description><category></category></item><item><title><![CDATA[Spring根据配置文件解析占位符]]></title><link>https://blog.youkuaiyun.com/Mutou_ren/article/details/110924493</link><guid>https://blog.youkuaiyun.com/Mutou_ren/article/details/110924493</guid><author>Mutou_ren</author><pubDate>Wed, 09 Dec 2020 15:13:26 +0800</pubDate><description><![CDATA[背景
在Spring中，使用${user.name}的形式，能够自动从配置文件中读取user.name的值进行替换。
原理
PropertyResolver
该接口的作用是解析属性值，提供了一系列获取属性以及解析属性的方法。

其中resolvePlaceholders(String text)和resolveRequiredPlaceholders(String text)提供了解析占位符${}属性解析的功能。

从继承图可以看出，我们熟知的StandardEnvironment也是一个PropertyR]]></description><category></category></item><item><title><![CDATA[synchronized加锁对象有什么要求？]]></title><link>https://blog.youkuaiyun.com/Mutou_ren/article/details/107488280</link><guid>https://blog.youkuaiyun.com/Mutou_ren/article/details/107488280</guid><author>Mutou_ren</author><pubDate>Fri, 24 Jul 2020 09:47:55 +0800</pubDate><description><![CDATA[不同线程通过synchronized锁对象，要想让锁达到效果，必须保证多个线程锁住的是同一个对象。

不要锁包装类：自动装箱使用的是valueOf方法，若没有缓存则会new一个包装对象，所以拿到的是不同对象，无法实现锁。
不要锁参数对象，SpringMVC在参数绑定时生成的参数对象是独立的
锁String字段时，要使用String.intern()返回的。该方法返回的是指向常量池的对象指针，可以保证是同一个。

对于String
String s1 = new String("jwb")//堆
String]]></description><category></category></item><item><title><![CDATA[synchronized和lock保证的可见性]]></title><link>https://blog.youkuaiyun.com/Mutou_ren/article/details/107535497</link><guid>https://blog.youkuaiyun.com/Mutou_ren/article/details/107535497</guid><author>Mutou_ren</author><pubDate>Fri, 24 Jul 2020 09:45:33 +0800</pubDate><description><![CDATA[synchronized在进入时要读取主存，退出时刷新主存。但不会禁止重排序，只会保证锁内和锁外的排序不会乱，因此只能保证刚进入时数据是最新的

]]></description><category></category></item><item><title><![CDATA[volatile修饰List能否保证内部元素的可见性？]]></title><link>https://blog.youkuaiyun.com/Mutou_ren/article/details/107530756</link><guid>https://blog.youkuaiyun.com/Mutou_ren/article/details/107530756</guid><author>Mutou_ren</author><pubDate>Thu, 23 Jul 2020 10:30:51 +0800</pubDate><description><![CDATA[实验一：ArrayList多线程下的可见性
代码
 	private static List&lt;Integer&gt; list;

    static {
       list  = new ArrayList&lt;Integer&gt;(20);
       list.add(0);
    }


    public static void main(String[] args) throws InterruptedException {
        CountDownLatch l]]></description><category></category></item><item><title><![CDATA[一文搞懂流程和原理——Zuul应用网关]]></title><link>https://blog.youkuaiyun.com/Mutou_ren/article/details/107362340</link><guid>https://blog.youkuaiyun.com/Mutou_ren/article/details/107362340</guid><author>Mutou_ren</author><pubDate>Wed, 15 Jul 2020 15:38:57 +0800</pubDate><description><![CDATA[Zuul
Zuul是什么？
一个应用网关服务，为庞大复杂的微服务系统提供统一的对外门面。
能够提供动态路由，负载均衡，统一鉴权，协议转换，监控监测等一系列功能。
Zuul自带了Ribbon和hystrix依赖，提供负载均衡和容灾支持。
Zuul的各种功能实现是基于其一系列的过滤器来实现的。
Zuul怎么用？
使用@EnableZuulProxy注解开启Zuul
路由功能
zuul:
  routes: 
  	&lt;服务名&gt;:
  		path: /server/url/**
  		service]]></description><category></category></item><item><title><![CDATA[一文搞懂流程和原理——Ribbon负载均衡客户端]]></title><link>https://blog.youkuaiyun.com/Mutou_ren/article/details/107353942</link><guid>https://blog.youkuaiyun.com/Mutou_ren/article/details/107353942</guid><author>Mutou_ren</author><pubDate>Wed, 15 Jul 2020 10:57:10 +0800</pubDate><description><![CDATA[Ribbon是什么？
一个用于客户端的负载均衡工具
Ribbon怎么用？
@Configuration
public class RibbonConfig{
	@LoadBalanced
	public RestTemplate restTemplate(){
		// ...
	} 
}

只需要在配置类中对RestTemplate的Bean加上@LoadBalanced注解即可。之后在使用RestTemplate进行请求调用时，会自动实现负载均衡
Ribbon如何实现？
RestTemplate的请求拦]]></description><category></category></item><item><title><![CDATA[拍案叫绝！Jackson内存设计中的组合拳——TextBuffer和BufferRecycler]]></title><link>https://blog.youkuaiyun.com/Mutou_ren/article/details/107120327</link><guid>https://blog.youkuaiyun.com/Mutou_ren/article/details/107120327</guid><author>Mutou_ren</author><pubDate>Sat, 04 Jul 2020 11:14:07 +0800</pubDate><description><![CDATA[Jackson作为Java三大Json框架之一，也是SpringBoot的默认序列化框架，具有速度快、内存占用低等特点。在rest服务盛行的今天，序列化和反序列化操作在系统中是一个极其常见的操作，这部分带来的内存开销也是一块重点。今天来看一下Jsckson中为了节省内存的神操作之一——TextBuffer和BufferRecycler的组合拳。
TextBuffer
TextBuffer是干嘛的？翻译官方注解，可以看作是一个StringBuffer（其实更应该是StringBuilder，因为它也是线程不安]]></description><category></category></item><item><title><![CDATA[图解JDK7中的HashMap闭环和丢失问题]]></title><link>https://blog.youkuaiyun.com/Mutou_ren/article/details/106222733</link><guid>https://blog.youkuaiyun.com/Mutou_ren/article/details/106222733</guid><author>Mutou_ren</author><pubDate>Tue, 19 May 2020 21:33:56 +0800</pubDate><description><![CDATA[关于HashMap的线程安全问题，网上资料很多。对于1.7版本的闭环问题，看了很多网上的资料一直搞不懂，今天又琢磨了一下，终于明白了，用自己看得懂的方式记录下。
首先说下闭环产生的原因：1.7的HashMap在扩容复制时，采用的是头插入法，这会导致原数组中的链表反转，即将原来的正向，复制成反向链表。
而在多线程环境下，可能存在其他线程完成了扩容复制操作，完成了后的数组链表变成了原来的反向链表。
由于可见性的保证，当前线程继续复制时，复制的时其他线程已经完成了的反向链表，但当前线程又会将其反转，导致又变成了正]]></description><category></category></item><item><title><![CDATA[SpringAOP使用CGLIB代理对protect方法无效]]></title><link>https://blog.youkuaiyun.com/Mutou_ren/article/details/105018052</link><guid>https://blog.youkuaiyun.com/Mutou_ren/article/details/105018052</guid><author>Mutou_ren</author><pubDate>Sat, 21 Mar 2020 21:55:33 +0800</pubDate><description><![CDATA[之前项目中遇到由于Mybatis缓存以及事物隔离导致的并发问题，无法拿到最新的数据，因此就将方法拆开，并将事物传播设置为了REQUIRES_NEW解决，详情看这记一次锁和事物导致的并发问题
doInsert这个方法是没有写在接口中的，由于CGLIB的代理是基于子类的，所以当时直接使用了public修饰符，是能够正常工作的（我们的项目SpringBoot版本1.5，依赖4.3的Spring，默认代理...]]></description><category></category></item><item><title><![CDATA[maven常用插件示例——编译、打包、拷贝依赖和资源、ant脚本]]></title><link>https://blog.youkuaiyun.com/Mutou_ren/article/details/104976436</link><guid>https://blog.youkuaiyun.com/Mutou_ren/article/details/104976436</guid><author>Mutou_ren</author><pubDate>Thu, 19 Mar 2020 20:57:30 +0800</pubDate><description><![CDATA[记录下maven打包的常用插件使用方法
&lt;build&gt;
		&lt;plugins&gt;
			&lt;!--编译插件，JDK8，编码UTF-8--&gt;
			&lt;plugin&gt;
				&lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
				&lt;artifactId&gt;maven-compiler...]]></description><category></category></item><item><title><![CDATA[Cglib动态代理的底层原理]]></title><link>https://blog.youkuaiyun.com/Mutou_ren/article/details/104662673</link><guid>https://blog.youkuaiyun.com/Mutou_ren/article/details/104662673</guid><author>Mutou_ren</author><pubDate>Wed, 04 Mar 2020 22:22:52 +0800</pubDate><description><![CDATA[使用
老规矩，先回忆一下怎么使用cglib的动态代理

写一个方法拦截器作为回调
创建Enhancer并设置父类和回调
使用Enhancer创建代理类

public class MyMethodInterceptor implements MethodInterceptor {
    @Override
    public Object intercept(Object o, Method ...]]></description><category></category></item><item><title><![CDATA[基于Javassist实现JDK的动态代理Proxy]]></title><link>https://blog.youkuaiyun.com/Mutou_ren/article/details/104647464</link><guid>https://blog.youkuaiyun.com/Mutou_ren/article/details/104647464</guid><author>Mutou_ren</author><pubDate>Wed, 04 Mar 2020 21:00:42 +0800</pubDate><description><![CDATA[使用
首先复习一下怎么使用动态代理

定义一个用户接口
实现一个用户接口的实现类
实现一个InvocationHandler
使用Proxy.newProxyInstance创建一个代理即可使用

public interface SayHelloInterface {
    void addMessage(String msg,String from,String to);
    Strin...]]></description><category></category></item><item><title><![CDATA[记一次锁和事物导致的并发问题]]></title><link>https://blog.youkuaiyun.com/Mutou_ren/article/details/104413262</link><guid>https://blog.youkuaiyun.com/Mutou_ren/article/details/104413262</guid><author>Mutou_ren</author><pubDate>Thu, 20 Feb 2020 16:58:02 +0800</pubDate><description><![CDATA[需求背景
对系统内的物品做一个SN码追踪，我这边的设计是入库和出库操作都会将物品的SN码和相关单据信息记录到一张表中，由于存在小零件的物品，一包几百个都是同一个SN码，所以这里牵扯到一个数量。表结构的核心字段如下




字段
类型




SN码
varchar


操作单号
varchar


操作数量
int


库内余数
int


…
…


并发问题
由于属于日志表，因此这张表的操作只...]]></description><category></category></item><item><title><![CDATA[ServletContainerInitializer及WebApplicationInitializer]]></title><link>https://blog.youkuaiyun.com/Mutou_ren/article/details/104239591</link><guid>https://blog.youkuaiyun.com/Mutou_ren/article/details/104239591</guid><author>Mutou_ren</author><pubDate>Sun, 09 Feb 2020 20:57:00 +0800</pubDate><description><![CDATA[ServletContainerInitializer即Servlet容器初始化组件，用来初始化Servlet容器。如注册Servlet、注册过滤器等。
public interface ServletContainerInitializer {

    /**
     * Receives notification during startup of a web application of...]]></description><category></category></item><item><title><![CDATA[SpringBoot的内置Tomcat是如何启动的？]]></title><link>https://blog.youkuaiyun.com/Mutou_ren/article/details/104234924</link><guid>https://blog.youkuaiyun.com/Mutou_ren/article/details/104234924</guid><author>Mutou_ren</author><pubDate>Sun, 09 Feb 2020 15:37:22 +0800</pubDate><description><![CDATA[整体流程
我们知道SpringApplication.run()时会创建根据推断的环境创建对应的应用上下文
protected ConfigurableApplicationContext createApplicationContext() {
		Class&lt;?&gt; contextClass = this.applicationContextClass;
		if (contextC...]]></description><category></category></item><item><title><![CDATA[剑指Offer刷题Java版——两个栈实现队列]]></title><link>https://blog.youkuaiyun.com/Mutou_ren/article/details/104223220</link><guid>https://blog.youkuaiyun.com/Mutou_ren/article/details/104223220</guid><author>Mutou_ren</author><pubDate>Sat, 08 Feb 2020 14:53:44 +0800</pubDate><description><![CDATA[题目

用两个栈来实现一个队列，完成队列的Push和Pop操作。 队列中的元素为int类型。

解题思路
两个栈一个用来压入，一个用来弹出。需要弹出的时候就把压入栈里的元素搞到弹出栈中即可。很简单的题，没啥可说的
解题代码
public class TwoStack {
    //用来push
    Stack&lt;Integer&gt; stack1 = new Stack&lt;Inte...]]></description><category></category></item><item><title><![CDATA[Spring是如何与Mybatis整合的？]]></title><link>https://blog.youkuaiyun.com/Mutou_ren/article/details/104216240</link><guid>https://blog.youkuaiyun.com/Mutou_ren/article/details/104216240</guid><author>Mutou_ren</author><pubDate>Fri, 07 Feb 2020 22:20:46 +0800</pubDate><description><![CDATA[Mybatis对外暴露的接口类是SqlSession，要创建SqlSession实现类就要使用SqlSessionFactory，因此在与Spring结合时，就需要将SqlSessionFactory交给Spring管理
在创建SqlSessionFactory时需要使用SqlSessionFactoryBuilder，需要为其传入一份配置文件，包含了数据源、配置信息以及mapper文件的路径等信...]]></description><category></category></item><item><title><![CDATA[Java中的对象拷贝]]></title><link>https://blog.youkuaiyun.com/Mutou_ren/article/details/104194769</link><guid>https://blog.youkuaiyun.com/Mutou_ren/article/details/104194769</guid><author>Mutou_ren</author><pubDate>Thu, 06 Feb 2020 13:24:45 +0800</pubDate><description><![CDATA[我们在开发中有时候会经常需要进行对象拷贝的情况，举个例子
  public static void main(String[] args) {
        m1(o);
        m2(o);
    }
    public static void m1(Object o){
		//会对o进行修改
    }
    public static void m2(Object o){
...]]></description><category></category></item><item><title><![CDATA[Java包装类中的缓存]]></title><link>https://blog.youkuaiyun.com/Mutou_ren/article/details/104194306</link><guid>https://blog.youkuaiyun.com/Mutou_ren/article/details/104194306</guid><author>Mutou_ren</author><pubDate>Thu, 06 Feb 2020 12:37:13 +0800</pubDate><description><![CDATA[缓存
包装类为了提高性能，会将最常用范围的基本数值对应的包装类进行缓存，通常使用cache内部类的static静态代码块进行缓存填充操作，valueOf()中存在缓存读取操作。我们通常定义包装类型时Integer a = 1，其默认就是使用的valueOf()方法，可自行通过javap进行反编译查看。
Integer a = 1;
Long b = 2l;
Character c = 'a';

...]]></description><category></category></item></channel></rss>