自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(154)
  • 收藏
  • 关注

转载 CAS

https://www.zhihu.com/question/65372648https://zhuanlan.zhihu.com/p/243739776

2021-01-06 15:23:48 182

原创 Spring根据配置文件解析占位符

背景在Spring中,使用${user.name}的形式,能够自动从配置文件中读取user.name的值进行替换。原理PropertyResolver该接口的作用是解析属性值,提供了一系列获取属性以及解析属性的方法。其中resolvePlaceholders(String text)和resolveRequiredPlaceholders(String text)提供了解析占位符${}属性解析的功能。从继承图可以看出,我们熟知的StandardEnvironment也是一个PropertyR

2020-12-09 15:13:26 531

原创 synchronized加锁对象有什么要求?

不同线程通过synchronized锁对象,要想让锁达到效果,必须保证多个线程锁住的是同一个对象。不要锁包装类:自动装箱使用的是valueOf方法,若没有缓存则会new一个包装对象,所以拿到的是不同对象,无法实现锁。不要锁参数对象,SpringMVC在参数绑定时生成的参数对象是独立的锁String字段时,要使用String.intern()返回的。该方法返回的是指向常量池的对象指针,可以保证是同一个。对于StringString s1 = new String("jwb")//堆String

2020-07-24 09:47:55 1050

原创 synchronized和lock保证的可见性

synchronized在进入时要读取主存,退出时刷新主存。但不会禁止重排序,只会保证锁内和锁外的排序不会乱,因此只能保证刚进入时数据是最新的

2020-07-24 09:45:33 1397

原创 volatile修饰List能否保证内部元素的可见性?

实验一:ArrayList多线程下的可见性代码 private static List<Integer> list; static { list = new ArrayList<Integer>(20); list.add(0); } public static void main(String[] args) throws InterruptedException { CountDownLatch l

2020-07-23 10:30:51 3181 2

原创 一文搞懂流程和原理——Zuul应用网关

ZuulZuul是什么?一个应用网关服务,为庞大复杂的微服务系统提供统一的对外门面。能够提供动态路由,负载均衡,统一鉴权,协议转换,监控监测等一系列功能。Zuul自带了Ribbon和hystrix依赖,提供负载均衡和容灾支持。Zuul的各种功能实现是基于其一系列的过滤器来实现的。Zuul怎么用?使用@EnableZuulProxy注解开启Zuul路由功能zuul: routes: <服务名>: path: /server/url/** service

2020-07-15 15:38:57 315

原创 一文搞懂流程和原理——Ribbon负载均衡客户端

Ribbon是什么?一个用于客户端的负载均衡工具Ribbon怎么用?@Configurationpublic class RibbonConfig{ @LoadBalanced public RestTemplate restTemplate(){ // ... } }只需要在配置类中对RestTemplate的Bean加上@LoadBalanced注解即可。之后在使用RestTemplate进行请求调用时,会自动实现负载均衡Ribbon如何实现?RestTemplate的请求拦

2020-07-15 10:57:10 165

原创 拍案叫绝!Jackson内存设计中的组合拳——TextBuffer和BufferRecycler

Jackson作为Java三大Json框架之一,也是SpringBoot的默认序列化框架,具有速度快、内存占用低等特点。在rest服务盛行的今天,序列化和反序列化操作在系统中是一个极其常见的操作,这部分带来的内存开销也是一块重点。今天来看一下Jsckson中为了节省内存的神操作之一——TextBuffer和BufferRecycler的组合拳。TextBufferTextBuffer是干嘛的?翻译官方注解,可以看作是一个StringBuffer(其实更应该是StringBuilder,因为它也是线程不安

2020-07-04 11:14:07 784

原创 图解JDK7中的HashMap闭环和丢失问题

关于HashMap的线程安全问题,网上资料很多。对于1.7版本的闭环问题,看了很多网上的资料一直搞不懂,今天又琢磨了一下,终于明白了,用自己看得懂的方式记录下。首先说下闭环产生的原因:1.7的HashMap在扩容复制时,采用的是头插入法,这会导致原数组中的链表反转,即将原来的正向,复制成反向链表。而在多线程环境下,可能存在其他线程完成了扩容复制操作,完成了后的数组链表变成了原来的反向链表。由于可见性的保证,当前线程继续复制时,复制的时其他线程已经完成了的反向链表,但当前线程又会将其反转,导致又变成了正

2020-05-19 21:33:56 867

原创 SpringAOP使用CGLIB代理对protect方法无效

之前项目中遇到由于Mybatis缓存以及事物隔离导致的并发问题,无法拿到最新的数据,因此就将方法拆开,并将事物传播设置为了REQUIRES_NEW解决,详情看这记一次锁和事物导致的并发问题doInsert这个方法是没有写在接口中的,由于CGLIB的代理是基于子类的,所以当时直接使用了public修饰符,是能够正常工作的(我们的项目SpringBoot版本1.5,依赖4.3的Spring,默认代理...

2020-03-21 21:55:33 2012

原创 maven常用插件示例——编译、打包、拷贝依赖和资源、ant脚本

记录下maven打包的常用插件使用方法<build> <plugins> <!--编译插件,JDK8,编码UTF-8--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler...

2020-03-19 20:57:30 349

原创 Cglib动态代理的底层原理

使用老规矩,先回忆一下怎么使用cglib的动态代理写一个方法拦截器作为回调创建Enhancer并设置父类和回调使用Enhancer创建代理类public class MyMethodInterceptor implements MethodInterceptor { @Override public Object intercept(Object o, Method ...

2020-03-04 22:22:52 600

原创 基于Javassist实现JDK的动态代理Proxy

使用首先复习一下怎么使用动态代理定义一个用户接口实现一个用户接口的实现类实现一个InvocationHandler使用Proxy.newProxyInstance创建一个代理即可使用public interface SayHelloInterface { void addMessage(String msg,String from,String to); Strin...

2020-03-04 21:00:42 435

原创 记一次锁和事物导致的并发问题

需求背景对系统内的物品做一个SN码追踪,我这边的设计是入库和出库操作都会将物品的SN码和相关单据信息记录到一张表中,由于存在小零件的物品,一包几百个都是同一个SN码,所以这里牵扯到一个数量。表结构的核心字段如下字段类型SN码varchar操作单号varchar操作数量int库内余数int……并发问题由于属于日志表,因此这张表的操作只...

2020-02-20 16:58:02 246

原创 ServletContainerInitializer及WebApplicationInitializer

ServletContainerInitializer即Servlet容器初始化组件,用来初始化Servlet容器。如注册Servlet、注册过滤器等。public interface ServletContainerInitializer { /** * Receives notification during startup of a web application of...

2020-02-09 20:57:00 400

原创 SpringBoot的内置Tomcat是如何启动的?

整体流程我们知道SpringApplication.run()时会创建根据推断的环境创建对应的应用上下文protected ConfigurableApplicationContext createApplicationContext() { Class<?> contextClass = this.applicationContextClass; if (contextC...

2020-02-09 15:37:22 624

原创 剑指Offer刷题Java版——两个栈实现队列

题目用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解题思路两个栈一个用来压入,一个用来弹出。需要弹出的时候就把压入栈里的元素搞到弹出栈中即可。很简单的题,没啥可说的解题代码public class TwoStack { //用来push Stack<Integer> stack1 = new Stack<Inte...

2020-02-08 14:53:44 135

原创 Spring是如何与Mybatis整合的?

Mybatis对外暴露的接口类是SqlSession,要创建SqlSession实现类就要使用SqlSessionFactory,因此在与Spring结合时,就需要将SqlSessionFactory交给Spring管理在创建SqlSessionFactory时需要使用SqlSessionFactoryBuilder,需要为其传入一份配置文件,包含了数据源、配置信息以及mapper文件的路径等信...

2020-02-07 22:20:46 391

原创 Java中的对象拷贝

我们在开发中有时候会经常需要进行对象拷贝的情况,举个例子 public static void main(String[] args) { m1(o); m2(o); } public static void m1(Object o){ //会对o进行修改 } public static void m2(Object o){...

2020-02-06 13:24:45 203

原创 Java包装类中的缓存

缓存包装类为了提高性能,会将最常用范围的基本数值对应的包装类进行缓存,通常使用cache内部类的static静态代码块进行缓存填充操作,valueOf()中存在缓存读取操作。我们通常定义包装类型时Integer a = 1,其默认就是使用的valueOf()方法,可自行通过javap进行反编译查看。Integer a = 1;Long b = 2l;Character c = 'a';...

2020-02-06 12:37:13 209

原创 HashMap的初始容量设置为多少合适?

我们知道对于List、Map这种底层是基于数组的动态容器,在扩容时会进行数组复制,因此为了避免这种额外开销,应该尽量在创建时指定大小。对于没有负载因子的如List,其扩容策略为满了后下次插入进行扩容,因此初始化大小为需要大小即可对于存在负载因子的HashMap、HashSet等,其扩容策略为本次插入后并判断自增后是否超过了阈值(容量*负载因子),如果超过了则进行扩容。因此初始化时指定的容量应为...

2020-02-03 17:37:31 4141

原创 剑指Offer刷题Java版——字符流中第一个不重复的字符

题目请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。如果当前字符流没有存在出现一次的字符,返回#字符。解题思路又是找重复,凡是遇到找重复找不重复的,桶计数都是个好方法,本题针对的是字符,而字符转为整数最大不超过127(一些扩...

2020-01-28 23:22:04 133

原创 剑指Offer刷题Java版——替换空格

题目请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。解题思路第一反应是replace对不对?API大家都会用,但是replace的底层是遍历查找,然后添加,由于要替换的字符数大于原字符数,因此会导致后面的字符进行复制移动,因此除了最后一个是空格的情况下,有几个空格就要遍历几次,...

2020-01-28 21:14:27 126

原创 剑指Offer刷题Java版——构建乘积数组

题目给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。解题思路引用的牛客网的答案既然不能用乘法,分析题目,我们可以将乘积拆为两项。即:C[i] = A[0] * A[1] *...*A[i-1]D[i] = A[i + 1] *...* A[n-1]B[i]...

2020-01-28 18:03:11 122

原创 剑指Offer刷题Java版——数组中重复的数字

题目在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。解题思路思路1——桶计数判断有重,第一反应就是桶计数的方法,也就是bitmap的思想,对于数字n,让数组array[n]+...

2020-01-28 17:18:15 188

原创 SpringMVC自定义ArgumentResolver实现自定义消息类型转换

上篇的convert是基于RequestResponseBodyMethodProcessor的,因此入参和返回需要加@RequestBody和@ResponseBody这里我自己写一个MyArgumentResolver来摒弃@RequestBody的限制@PostMapping(value = "/properties2", consumes = "text/pro...

2020-01-25 17:23:12 1366

原创 解析自定义MediaType的HttpMessageConverter

@PostMapping(value = "/properties", consumes = "text/properties;charset=utf-8") public Properties properties(@RequestBody Properties properties){ return properties; }publ...

2020-01-24 16:54:58 787

原创 SpringMVC的入参转换和响应参数转换

在上一篇文章中讲了大概的执行流程,这里详细讲一下入参转换和响应转换的实现原理入参转换和响应转换的流程都是在通过Adapter调用HandlerMethod时发生的。如下是请求头设置,SpringMVC会根据content-type和accept类型选择合适的HttpMessageConverter来进行消息的转换参数转化private Object[] getMethodArgument...

2020-01-24 15:03:33 1027

原创 SpringMVC的请求响应流程及参数类型自动转换

纵观全局我们先进入DIspatchServlet.doDispatch(),我们分析其调用过程的主要方法如下:// 根据请求拿到具体的处理器方法HandlerMethod并获取拦截器包装成HandlerExecutionChainmappedHandler = getHandler(processedRequest);// 根据HandlerMethod得到对应的HandlerAdapte...

2020-01-23 22:35:21 528

原创 SpringBoot是如何进行自动装配的

自动装配在没有SpringBoot的时代,当我们需要引入一个额外的依赖如Redis时,我们要在配置文件中做一系列的配置才能使用,而在SpringBoot的自动装配中,我们只需要引入starter包然后使用一个@EnableCache注解即可使用。SpringBoot是如何做到的呢?我们知道,当我们在启动Spring应用时,我们需要为Spring提供配置信息(XML或Configuration)...

2020-01-23 17:00:19 965

原创 SpringApplication.run到底发生了什么?

以下代码为SpringBoot应用的启动类的代码,相信每个人都见过太多次这个启动类了,main方法中只有一行代码,这行代码到底发生了什么?public class ApiApplication { public static void main(String[] args) { SpringApplication.run(ApiApplication.class, arg...

2020-01-22 19:14:18 442

原创 HTTPS的传输流程

非对称效率不高,对称安全性不高,怎么搞?结合使用,即对称密钥分配使用非对称加密进行,数据传输过程使用对称加密。客户端先将自己支持的加密算法发送给服务端服务端挑选一个客户端支持的加密算法,生成一个非对称加密的密钥对。然后使用CA的私钥将给客户端的公钥进行加密,形成数字证书发给客户端客户端根据内置的CA公钥进行解密验证,成功后会得到服务端生成的一个公钥客户端随机生成一个对称密钥,用公钥加密...

2020-01-18 14:09:37 243

原创 SQL中的索引设计规范——三星索引

索引的原理首先要明确,我们平时所说的最左匹配,针对的是索引中的列的顺序,与SQL语句WHERE后面跟的条件无关。因为语句中的条件谓词可以随意调整顺序不影响结果,SQL优化器会自动帮我们调整顺序以使用索引。在索引匹配时,遇到范围和模糊匹配时终止。select name,age,address,phone,email where name = 'Mutou_ren' and address = '...

2020-01-15 20:27:08 926

原创 Mysql的Explain中的type分析

ALL全表扫描Index索引表全表扫描,其性能不会比ALL高,因为它实际还是会回表查数据的,每在索引表中查一条索引就回主表查一次数据除非是排序情况,因为聚集索引是按照主键排序的,而其他索引是根据索引的列排序的。如果是需要列排序,Index才会比ALL快,因为免除了一次排序。什么时候会出现index情况?一般需要查询的列都处在索引中时,会走index,因为要查的数据都在索引中,因此直接在索...

2020-01-13 21:51:55 327

原创 CompletableFuture的用法及简要原理

//自定义线程池private static ThreadPoolExecutor executor = new ThreadPoolExecutor(8,16,20, TimeUnit.SECONDS,new LinkedBlockingDeque<>(20), Executors.defaultThreadFactory(), (r, executor1) -> new T...

2020-01-12 17:15:10 1023

原创 AQS的doAcquire和doRelease

上篇博客讲了tryAcquire和tryRelease,这篇来看看AQS自身实现的doAcquire和doReleaseacquire独占锁AQS自身没有提供对doAcquireInterruptibly和doAcquireNanos的调用,交由子类使用,这俩都将同步队列节点入队操作放在了自己的方法内,而AQS自身对acquireQueued的实现acquire将这个操作从do方法中移了出来...

2020-01-07 22:45:21 270

原创 AQS的非公平锁与同步队列的FIFO冲突吗?

公平锁与非公平锁的含义都很明白,公平锁必须排队获取锁,锁的获取顺序完全根据排队顺序而来,而非公平就是谁抢到是谁的。我们都知道AQS中的锁获取,如果首次获取失败会进入到内部的同步队列中阻塞等待,只有前面的节点唤醒当前节点才能去尝试获取锁从我之前的博客内容可知,锁获取的核心,实际上是在try方法中定义的,在节点从阻塞中醒来时,都会用try方法来获取锁,而公平与否在try方法中体现,即在公平锁中,t...

2020-01-07 22:44:49 1420 19

原创 AQS子类的tryAcquire和tryRelease的实现

思想AQS通过一个private volatile int state;来表示锁的状态,当state=0时代表无锁,>0代表有锁,>1代表重入次数AQS从AOS继承了private transient Thread exclusiveOwnerThread;用来记录当前持有独占锁的线程暴露方法// 尝试获取 独占锁protected boolean tryAcquire(in...

2020-01-07 19:50:43 1652

原创 Redis分布式锁中的问题

使用使用set key value ex 5 nx命令设置key value 5秒过期 不存在才能设置成功,成功代表获取了分布式锁随机值在set时,key为固定,但value对不同线程应不同,如使用线程名。如果使用的value相同会有什么问题?我们假设固定为key=lock_key,value=lock_value假设线程1获取到了分布式锁,超时30秒,但线程1的实际执行实际达到了40秒...

2020-01-05 19:33:18 176

原创 Redis缓存问题及解决方案

查询流程:【问题1】——穿透、击穿及雪崩问题描述线程T1在查DB并更新redis缓存的过程中(还未成功将结果放入缓存),有大量并发请求对该Key请求,导致有大量的线程去走查DB并更新redis缓存的流程,不仅对DB造成巨大压力,同时还会产生多次不必要的redis缓存更新操作(网络开销)问题原因没有对某些可能的热点数据进行预热缓存过期导致【缓存击穿】 或者【缓存雪崩】对同一个不存在...

2020-01-05 17:09:30 289

空空如也

空空如也

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

TA关注的人

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