- 博客(117)
- 资源 (15)
- 收藏
- 关注
原创 LockSupport使用及源码详解
LockSupport使用及源码详解在讲了一批并发工具后,突然想起LockSupport类了,这个工具类我也很少用,所以这次写了个小demo后,决定也写一篇文章记录一下,以下就是记录过程。LockSupport用法在网上随便找了个演示demo,如下:public class LockSupportDemo { public static void main(String[] a...
2019-11-27 08:28:58
2269
1
原创 CyclicBarrier源码分析
CyclicBarrier源码分析上一篇讲到了使用CountDownLatch来阻塞主线程继续执行,然后想到了CyclicBarrier,CyclicBarrier则与CountDownLatch相反,CyclicBarrier一般是用来阻塞子线程执行,在这想到CyclicBarrier虽然用的比较多,但是对其工作机制,源码并不是太熟悉,因此此处写一篇CyclicBarrier的源码分析记录一下...
2019-11-25 08:53:28
1925
原创 CountDownLatch源码分析
CountDownLatch源码分析上一节讲到CopyOnWriteArrayList,其中用到了CountDownLatch,于是想这节就直接讲讲CountDownLatch的原理吧,顺便说下CountDownLatch的简单用法。CountDownLatch用法想来想去还是把上一个demo贴过来吧,如下:CopyOnWriteArrayList<Integer> list...
2019-10-28 08:34:19
1987
原创 CopyOnWriteArrayList源码详解
CopyOnWriteArrayList源码详解最近在一个代码优化中使用到CopyOnWriteArrayList,想起这个java容器知道使用特性是读写分离,在每次写入时都复制一个新的list进行操作,但是没有具体的看过其源码细节,于是写一篇文章来记载下。demo演示首先写一个简单的程序演示一下,如下:CopyOnWriteArrayList<Integer> list =...
2019-10-24 07:20:08
432
原创 ThreadLocal详解(二)
ThreadLocal详解(二)上一篇文章讲了ThreadLocal的get、set、resize等方法的源码,但是对于一些单独的方法例如cleanSomeSlots、expungeStaleEntry并没有讲述,这一节就是要讲述这些源码,在讲之前首先提几个ThreadLocal的注意事项,一般来说就是ThreadLocal如果在使用不当的情况下会出现内存泄漏的问题,其原因就在于如果在线程清除时...
2019-10-22 07:30:39
460
原创 ThreadLocal详解
ThreadLocal详解ThreadLocal平常用的还是挺多的,但是对于内部实现一直没有仔细了解过,这几天在写一个工程的时候,用到了ThreadLocal保存上下文,突然想到了ThreadLocal一些实现细节上的问题,看了下,同时以此记录一下,原本想到直接就写ThreadLocal,但是看了ThreadLocal源码发现有很多地方需要单独说下,比如ThreadLocal的寻址方式,Thr...
2019-10-17 07:50:13
253
原创 Hash寻址详解
Hash寻址详解最近在使用ThreadLocal保存上下文信息,原本准备写ThreadLocal原理以及源码详解,然后在偶尔中看到关于ThreadLocal中的hash寻址方式,与HashMap中寻址方式不同,于是决定先写一篇讲述Hash寻址方式的文章,再回头讲述ThreadLocal源码。Hash还是得从Hash的定义开始说起,hash的基本思想就是从一条记录中取出一条一个字段称之为ke...
2019-09-16 08:12:00
2950
原创 MyBatis源码分析之Script用法详解
MyBatis源码分析之在上一篇文章中讲到MyBatis的#{paras}和${paras}用法,在里面提到在解析sql组装成SqlSource对象时,会判断当前sql是否是动态类型,然后里面有一个对sql中是否含有**1. 与之前相同,讲到这里还是先讲一下@ResultMap(&quot;BaseResultMap&quot;)@Select(&quot;&amp;lt;script&amp;gt;&quo
2019-01-22 08:14:49
13626
原创 MyBatis源码分析之防SQL注入
MyBatis源码分析之防SQL注入这一节来讲下MyBatis的防SQL注入,SQL注入大多数也会比较清楚,就是SQL参数对应的字段值时插入混合SQL,如 ** username = or 1= 1** 这种,如果有更恶劣的,带上drop database 这种都是有可能的,所以一般SQL都会进行一定防注入处理,MyBatis其实用法大都清楚,就是**#{paras}和${paras}**两种用...
2019-01-18 08:21:46
1633
2
原创 Deque用法及原理讲解
Deque用法及原理讲解最近想着对现有知识点进行一个总结,决定从集合开始,想想便从Deque开始吧,Deque用的比较少,但是还是一个功能十分强大的队列,这种双向队列即可以支持先进后出,也能支持先进先出的格式,相当于同时实现了Stack和Vector,今天就来讲一讲Deque用法以及底层源码。1. Deque用法先写一个简单的demo,这个demo也是以前查Deque时看别人写的,然后对...
2019-01-14 08:17:35
5903
1
原创 MyBatis源码分析之@SelectProvider注解使用详解
MyBatis源码分析之@SelectProvider注解使用详解之前讲了MyBatis的配置、plugin、Select查询,还有@MapKey注解的使用与原理,还有返回@ResultMap等等,我原想直接从MyBatis的缓存开始说起,但是想想还是得说一下MyBatis中的@selectProvider,这个注解我也是在用了好久的MyBatis才用到,功能就是用来单独写一个class类与方法...
2019-01-11 08:31:57
13705
原创 MyBatis源码分析之@ResultMap注解详解
MyBatis源码分析之@ResultMap注解详解在前一篇文章讲**@MapKey注解时,我原想将@ResultMap注解也一起拿出来说一下,但是发现@ResultMap解析加载源码非常多,想想就不在一篇文章中讲了,分开单独来说,这一篇就来彻底探索一下@ResultMap**注解。1. 加载过程说到解析Mapper方法上的注解**@ResultMap**,这个就要回到解析configur...
2019-01-10 08:19:22
12389
1
原创 MyBatis中@MapKey使用详解
MyBatis中@MapKey使用详解我们在上一篇文章中讲到在Select返回类型中是返回Map时,是对方法中是否存在注解@MapKey,这个注解我也是第一次看到,当时我也以为是纯粹的返回单个数据对象的Map类型,但是发现还是有些不同的,这个可以用来返回多条记录,具体用法与分析如下。@MapKey用法我查了一下MapKey的用法,这里加上MapKey注解后,还有指定一个字段作为返回Map中...
2019-01-08 08:18:23
79036
15
原创 Mybatis源码分析之Select返回数据分析
Mybatis源码分析之Select返回数据分析在之前的一篇文章中分析了@Select注解的使用方法,在查询方法中我们知可以返回Map类型,也可以返回指针,或者是list集合,或是单条记录,今天就对这几种返回做一个源码分析。Select查询在这里就不需要再写一个demo演示了,用法无非这么多,直接看查询的源码吧。首先在看对应select的查询源码时先看下MyBatis是怎么定义metho...
2019-01-07 08:06:48
2089
1
原创 MyBatis plugin的使用与源码解析
MyBatis plugin的使用与源码解析这一节来讲下Mybatis中的plugin的使用,plugin作为对执行期间对Executor、StatementHandler的一种增强等等,我见过用的最多的应该就是Mybatis的分页插件PageHelper,PageHelper因为简单易用被广泛用于各种大小工程中,虽说PageHelper使用起来确实挺舒服,但是在遇到一些查询性能上的问题时,Pa...
2019-01-05 08:59:55
896
原创 MyBatis注解@Select、@Update分析
MyBatis注解@Select、@Update分析前面几篇文章分别分析了Mybatis中的Configuration的配置信息,MyBatis中的Mapper调用等等,在分析配置信息时只是讲了如何解析xml中的sql查询,但是并没有讲怎么解析Mapper中注解对应的SQL,就是如下:@ResultMap("BaseResultMap")@Select("select id, usernam...
2019-01-04 09:47:00
5155
原创 Mybatis之Mapper调用源码分析
Mybatis之Mapper调用源码分析这一篇是承接前面两篇的,分别为:Mybatis源码解析之配置加载(一), Mybatis源码解析之配置加载(二),前面两篇讲了在Mybatis启动时如何加载配置,这一节就讲在运行时,如何通过session获取Mapper代理类,从而实现对数据库的查询操作。程序首先展示下之前写的程序,main程序在第一篇中有展示,这里就不再完全的贴出来了,获取sess...
2019-01-03 08:08:56
704
原创 # Mybatis源码解析之配置加载(二)
Mybatis源码解析之配置加载(二)这一篇是承接上一篇文章Mybatis源码解析之配置加载(一),上一篇原本是想把整个配置加载都分析完全,然后发现内容还是比较多,所以决定分成两篇来说好了,现在就开始剩下的配置分析。配置加载继续回到parseConfiguration方法中,**parseConfiguration()**方法如下:private void parseConfigurat...
2019-01-02 08:13:53
669
1
原创 Mybatis源码解析之配置加载(一)
Mybatis源码解析之配置加载(一)用了好几年的mybatis了,但是很少来钻研mybatis原理所在,最近抽出空来,就把这一整套源码都研究了下,然后发现就是这些东西,mybatis没啥难度,于是决定把研究的这一整套写一个mybatis系列,记录一下,在这些完了以后,顺便写一个小的mybatis框架。1. demo演示还是从用法开始吧,就不开始就从源码说了,mybatis的conf配置文...
2019-01-01 11:27:08
3454
2
原创 Leveldb数据Compaction源码分析(1)
Leveldb数据Compaction源码分析(1)这一节来讲Leveldb的数据压缩过程,上一节讲了Leveldb的数据寻找过程,文章地址为:但是最后在讲Leveldb中的Leveln的层级寻找时,我想应该是有没有看懂的,直接二分法找到sstable,然后加载缓存就能找到文件,看源码或许有些疑惑,但是这个是和Leveldb的数据压缩过程是有关的,这节就来讲Leveldb的数据压缩过程。...
2018-07-31 10:06:52
977
2
原创 Leveldb读取数据源码分析
Leveldb读取数据源码分析上一篇文章讲了Snapshot源码,在这一篇文章中原本是要讲version、versionSet这些,但是想想还是从Leveldb的读取和存储开始讲起,Leveldb的存储比较简单,主要麻烦的还是读取这一块,需要判断从memTable、memTable、level0、level层级中分开寻找,如果从上一级中找到了数据,那么下一级就不再继续寻找了,因此寻找要麻烦许多...
2018-07-30 07:53:43
1121
原创 level Snapshot源码分析
# level Snapshot源码分析上一篇文章中讲了WriteBatch,这一篇文章中开始讲快照Snapshot,Snapshot在文章中 leveldb中WriteBatch、Snapshot使用中讲过使用方法,这里面就不再继续讲用法了,这一节结合着之前写的Demo来讲源码。Snapshot源码之前写的demo为:private final File data...
2018-07-25 07:29:49
511
原创 levelDB WriteBatch源码解析
levelDB WriteBatch源码解析上一篇文章中讲了leveldb中WriteBatch、Snapshot使用,但是leveldb毕竟只是一个基础的存储引擎,没有太多的特性或者api使用可以讲,因此便直接从源码上开始,我这就从WriteBatch开始吧。有一些遗漏的以后补充进来,以后再慢慢进行整理。WriteBatch源码我们先看下WriteBatch,Writebat...
2018-07-23 08:04:20
756
原创 leveldb中WriteBatch、Snapshot使用
leveldb中WriteBatch、Snapshot使用上一节中仅仅做了一个leveldb的介绍,以及简单的put、get、del的使用,没有对leveldb的一些深入的特性进行讲解,算得上只是一个入门罢了,知道什么是leveldb,而作为一个基础的存储引擎,本身没有太多的特性其实也是正常的,如果想要在生产环境使用一个类似的存储,其实还是更推荐使用mapdb,有着相当丰富的特性供以使用,我有...
2018-04-08 07:56:28
2888
原创 leveldb入门
leveldb入门leveldb简介以前在大学的时候偶尔了解过leveldb,当时只是知道leveldb是一个存取性能极强的存储引擎,非常适合于顺序存储,当时时间不多,有很多其他的需要去学习,另外也没没有用到,因此一直没有了解过,最近有一些功夫突然再次看到了leveldb,想接触一下,然后发现这个是C++编写的,原生不支持java,但是有一个开发者照着C++的源码编写了一个java版,...
2018-04-03 08:02:10
3014
原创 双重大数组循环优化
双重大数组循环优化一、前言这几天发现服务在凌晨时容易报警,持续半个小时才正常,第二天分析日志和检查代码发现,有一个过滤黑白名单的操作,其中黑名单的数据有39万,白名单数据30万,然后处理的数据也有80万左右,在业务逻辑中黑白名单本身有一个过滤逻辑,数据对黑白名单有一个过滤逻辑,此处总共耗时在30分钟左右,在耗时将近40分钟后,下一轮低频任务才开启,所以cat不断报警,此处开启下一轮时间...
2018-03-04 19:19:19
3140
2
原创 netty编解码之jboss marshalling
netty编解码之jboss marshallingjboss marshalling是jboss内部的一个序列化框架,速度也十分快,这里netty也提供了支持,使用十分方便,不需要像protobuf一样编写proto文件,只需要提供两个编解码器即可,以下就是jboss marshalling使用的开始。源码程序model类model类和之前编写java序列化的时候没有区别,这里便不再多说,仅仅贴出
2017-12-11 08:10:28
3667
2
原创 netty编解码之使用protobuf
netty编解码之使用protobufprotobuf这个序列化框架在我们公司使用了,我负责的模块中使用protobuf生成了一些model,然后使用了protostuff对缓存在redis中的数据进行序列化和反序列化,速度非常快,解决了一些当时的序列化和反序列化太慢的问题,这节来讲下netty中使用protobuf进行序列化的用法。这里可以下载protobuf工具然后使用命令根据proto生成ja
2017-12-07 08:03:48
2080
2
原创 netty编解码之java原生序列化
netty序列化之java原生序列化前几天有空看了下netty使用java原生序列化、以及使用protobuf、jboss marshalling进行编解码,各种技术之间差异挺大,使用的方法各自不同,性能上原生的性能优势确实不大,但是另外两种确实很有优势,觉得有点意思,于是准备写一篇文章记载一下,但是一篇文章篇幅太长,因此拆成了三篇文章分别来讲。java序列化代码这个简单的程序就是server和cl
2017-12-06 07:46:06
1128
原创 netty中epoll server和nio server的使用
netty中epoll server和nio server的使用这几天有空研究了下netty中的EpollEventLoopGroup和NioEventLoopGroup的用法,在编码上没有显著的不同,对应的epoll,有一套的api供于使用,但是因为只能在linux机上使用,因此又借助了docker运行linux容器来运行相应程序,这节就来具体的讲述下。nio server编写了一个简单的Hell
2017-11-15 08:03:36
12899
3
原创 JDK 动态代理运行原理
JDK 动态代理运行原理 程序演示 源码讲解 总结 这几天有空研究了下JDk的动态代理,JDK的动态代理类都在java.lang.reflect包下,写了一些小程序来演示了相关类的使用,同时做了一些与CGLIb的对比,以后有空再讲述下lombok中相关注解的使用。1. 程序演示接口:HelloWorld:public interface HelloWorld { voi
2017-11-09 07:58:01
903
原创 spring boot jar的启动原理分析
spring boot jar的启动原理分析 1、前言 2、分模块后的结构 3、MANIFEST.MF文件 4、运行 5、main程序的启动流程 6、总结 1.前言近来有空对公司的open api平台进行了些优化,然后在打出jar包的时候,突然想到以前都是对spring boot使用很熟练,但是从来都不知道spring boot打出的jar的启动原理,然后这回将j
2017-10-24 08:02:15
6974
1
原创 Spring cloud 中@EnableEurekaClient源码分析
Spring cloud 中@EnableEurekaClient源码分析上一篇文章中讲述了@EnableEurekaClient和@EnableDiscoveryClient区别,原想可能底层会有较多不同,但是查看源码的时候发现@EnableEurekaClient本身就是用@EnableDiscoveryClient来实现的,因此没有多大的研究价值,但是如果继续讲@EnableEurekaCli
2017-10-23 08:26:46
9342
4
原创 spring cloud服务发现注解之@EnableDiscoveryClient与@EnableEurekaClient
spring cloud服务发现注解之@EnableDiscoveryClient与@EnableEurekaClient在之前的一篇文章Spring Cloud feign使用中在使用服务发现的时候提到了两种注解,一种为@EnableDiscoveryClient,一种为@EnableEurekaClient,用法上基本一致,今天就来讲下两者,下文是从stackoverflow上面找到的对这两者的
2017-10-17 08:04:54
76410
5
原创 spring cloud 与 docker-compose构建微服务
spring cloud 与 docker-compose构建微服务 前言 目录结构 配置文件的修改 Dockerfile文件 bash脚本 docker-compose.yml文件 编译与运行 综上 1. 前言上一篇文章中讲了服务注册中心eureka-server、服务消费者service-a、服务提供者service-b,service-a和servi
2017-09-04 08:27:54
10836
4
原创 Spring Cloud feign使用
Spring Cloud feign使用 前言 环境准备 应用模块 应用程序 应用启动 feign特性 综上 1. 前言我们在前一篇文章中讲了一些我使用过的一些http的框架 服务间通信之Http框架,其实最终还是准备讲述spring cloud fegin,使用spring cloud fegin完成更为优雅的http的调用方式,以及在服务之间的调用与远程
2017-08-29 08:01:46
6976
原创 服务间通信之Http框架
服务间通信之Http框架 1.服务间通讯调用 2.jersey代理连接池 3.综上 1.服务间通信调用首先不提在微服务中,就是在我们使用spring cloud技术栈构建我们的服务中,如果我们需要调用其他的服务或者第三方的服务,一般的通信方式无非是http通信、rpc通信、异步消息通信等等,当然大多数服务一般都是以http接口的形式提供出来,那么可以用来调用该服务的方法可谓是
2017-08-03 07:59:46
4995
1
原创 netty之SimpleChannelInboundHandler
netty之SimpleChannelInboundHandler在最开始学些netty的时候,写的服务端demo的handler,继承的都是ChannelInboundHandlerAdapter,客户端继承的是SimpleChannelInboundHandler,当然最开始学的时候都是在不断的写demo,并不清楚为何两边继承的类还不一样,还想过服务端handler也继承SimpleChanne
2017-07-25 07:24:21
7257
2
原创 netty入门及介绍
netty入门及介绍 1、前言 2、服务端程序 3、客户端程序 4.部分netty知识详解 5、总结 1.前言前段时间研究了一段时间的rpc框架,dubbo、zero ice等等都熟悉了一下,然后发现许多rpc框架底层都是采用netty进行通信,由此对netty有了一些兴趣,然后花了三个多月的时间学习了一下netty,一些博文专栏中的文章、官网的例子,都去写了一遍,不
2017-07-06 17:20:28
1133
原创 flask使用Blueprint进行多模块应用的编写
flask使用Blueprint进行多模块应用的编写 1、blueprint 2、分模块后的结构 3、业务模块 4、运行 5、总结 1、blueprint在使用flask进行一个项目编写的时候,可能会有许多个模块,如一个普通的互联网sass云办公应用,会有用户管理、部门管理、账号管理等模块,如果把所有的这些模块都放在一个views.py文件之中,那么最后views.p
2017-03-28 08:42:59
16050
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人