java技术与应用
文章平均质量分 85
专注于java深层次的原理讲解与技术应用。
叶长风
会scala和python的程序员
展开
-
LockSupport使用及源码详解
LockSupport使用及源码详解在讲了一批并发工具后,突然想起LockSupport类了,这个工具类我也很少用,所以这次写了个小demo后,决定也写一篇文章记录一下,以下就是记录过程。LockSupport用法在网上随便找了个演示demo,如下:public class LockSupportDemo { public static void main(String[] a...原创 2019-11-27 08:28:58 · 2223 阅读 · 1 评论 -
CyclicBarrier源码分析
CyclicBarrier源码分析上一篇讲到了使用CountDownLatch来阻塞主线程继续执行,然后想到了CyclicBarrier,CyclicBarrier则与CountDownLatch相反,CyclicBarrier一般是用来阻塞子线程执行,在这想到CyclicBarrier虽然用的比较多,但是对其工作机制,源码并不是太熟悉,因此此处写一篇CyclicBarrier的源码分析记录一下...原创 2019-11-25 08:53:28 · 1877 阅读 · 0 评论 -
CountDownLatch源码分析
CountDownLatch源码分析上一节讲到CopyOnWriteArrayList,其中用到了CountDownLatch,于是想这节就直接讲讲CountDownLatch的原理吧,顺便说下CountDownLatch的简单用法。CountDownLatch用法想来想去还是把上一个demo贴过来吧,如下:CopyOnWriteArrayList<Integer> list...原创 2019-10-28 08:34:19 · 1938 阅读 · 0 评论 -
CopyOnWriteArrayList源码详解
CopyOnWriteArrayList源码详解最近在一个代码优化中使用到CopyOnWriteArrayList,想起这个java容器知道使用特性是读写分离,在每次写入时都复制一个新的list进行操作,但是没有具体的看过其源码细节,于是写一篇文章来记载下。demo演示首先写一个简单的程序演示一下,如下:CopyOnWriteArrayList<Integer> list =...原创 2019-10-24 07:20:08 · 393 阅读 · 0 评论 -
ThreadLocal详解(二)
ThreadLocal详解(二)上一篇文章讲了ThreadLocal的get、set、resize等方法的源码,但是对于一些单独的方法例如cleanSomeSlots、expungeStaleEntry并没有讲述,这一节就是要讲述这些源码,在讲之前首先提几个ThreadLocal的注意事项,一般来说就是ThreadLocal如果在使用不当的情况下会出现内存泄漏的问题,其原因就在于如果在线程清除时...原创 2019-10-22 07:30:39 · 418 阅读 · 0 评论 -
ThreadLocal详解
ThreadLocal详解ThreadLocal平常用的还是挺多的,但是对于内部实现一直没有仔细了解过,这几天在写一个工程的时候,用到了ThreadLocal保存上下文,突然想到了ThreadLocal一些实现细节上的问题,看了下,同时以此记录一下,原本想到直接就写ThreadLocal,但是看了ThreadLocal源码发现有很多地方需要单独说下,比如ThreadLocal的寻址方式,Thr...原创 2019-10-17 07:50:13 · 213 阅读 · 0 评论 -
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 · 13336 阅读 · 0 评论 -
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 · 1473 阅读 · 2 评论 -
Deque用法及原理讲解
Deque用法及原理讲解最近想着对现有知识点进行一个总结,决定从集合开始,想想便从Deque开始吧,Deque用的比较少,但是还是一个功能十分强大的队列,这种双向队列即可以支持先进后出,也能支持先进先出的格式,相当于同时实现了Stack和Vector,今天就来讲一讲Deque用法以及底层源码。1. Deque用法先写一个简单的demo,这个demo也是以前查Deque时看别人写的,然后对...原创 2019-01-14 08:17:35 · 5827 阅读 · 1 评论 -
MyBatis源码分析之@SelectProvider注解使用详解
MyBatis源码分析之@SelectProvider注解使用详解之前讲了MyBatis的配置、plugin、Select查询,还有@MapKey注解的使用与原理,还有返回@ResultMap等等,我原想直接从MyBatis的缓存开始说起,但是想想还是得说一下MyBatis中的@selectProvider,这个注解我也是在用了好久的MyBatis才用到,功能就是用来单独写一个class类与方法...原创 2019-01-11 08:31:57 · 13370 阅读 · 0 评论 -
MyBatis源码分析之@ResultMap注解详解
MyBatis源码分析之@ResultMap注解详解在前一篇文章讲**@MapKey注解时,我原想将@ResultMap注解也一起拿出来说一下,但是发现@ResultMap解析加载源码非常多,想想就不在一篇文章中讲了,分开单独来说,这一篇就来彻底探索一下@ResultMap**注解。1. 加载过程说到解析Mapper方法上的注解**@ResultMap**,这个就要回到解析configur...原创 2019-01-10 08:19:22 · 12215 阅读 · 1 评论 -
MyBatis中@MapKey使用详解
MyBatis中@MapKey使用详解我们在上一篇文章中讲到在Select返回类型中是返回Map时,是对方法中是否存在注解@MapKey,这个注解我也是第一次看到,当时我也以为是纯粹的返回单个数据对象的Map类型,但是发现还是有些不同的,这个可以用来返回多条记录,具体用法与分析如下。@MapKey用法我查了一下MapKey的用法,这里加上MapKey注解后,还有指定一个字段作为返回Map中...原创 2019-01-08 08:18:23 · 76854 阅读 · 15 评论 -
Mybatis源码分析之Select返回数据分析
Mybatis源码分析之Select返回数据分析在之前的一篇文章中分析了@Select注解的使用方法,在查询方法中我们知可以返回Map类型,也可以返回指针,或者是list集合,或是单条记录,今天就对这几种返回做一个源码分析。Select查询在这里就不需要再写一个demo演示了,用法无非这么多,直接看查询的源码吧。首先在看对应select的查询源码时先看下MyBatis是怎么定义metho...原创 2019-01-07 08:06:48 · 1985 阅读 · 1 评论 -
MyBatis plugin的使用与源码解析
MyBatis plugin的使用与源码解析这一节来讲下Mybatis中的plugin的使用,plugin作为对执行期间对Executor、StatementHandler的一种增强等等,我见过用的最多的应该就是Mybatis的分页插件PageHelper,PageHelper因为简单易用被广泛用于各种大小工程中,虽说PageHelper使用起来确实挺舒服,但是在遇到一些查询性能上的问题时,Pa...原创 2019-01-05 08:59:55 · 849 阅读 · 0 评论 -
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 · 5071 阅读 · 0 评论 -
Leveldb数据Compaction源码分析(1)
Leveldb数据Compaction源码分析(1)这一节来讲Leveldb的数据压缩过程,上一节讲了Leveldb的数据寻找过程,文章地址为:但是最后在讲Leveldb中的Leveln的层级寻找时,我想应该是有没有看懂的,直接二分法找到sstable,然后加载缓存就能找到文件,看源码或许有些疑惑,但是这个是和Leveldb的数据压缩过程是有关的,这节就来讲Leveldb的数据压缩过程。...原创 2018-07-31 10:06:52 · 925 阅读 · 2 评论 -
Leveldb读取数据源码分析
Leveldb读取数据源码分析上一篇文章讲了Snapshot源码,在这一篇文章中原本是要讲version、versionSet这些,但是想想还是从Leveldb的读取和存储开始讲起,Leveldb的存储比较简单,主要麻烦的还是读取这一块,需要判断从memTable、memTable、level0、level层级中分开寻找,如果从上一级中找到了数据,那么下一级就不再继续寻找了,因此寻找要麻烦许多...原创 2018-07-30 07:53:43 · 1079 阅读 · 0 评论 -
level Snapshot源码分析
# level Snapshot源码分析上一篇文章中讲了WriteBatch,这一篇文章中开始讲快照Snapshot,Snapshot在文章中 leveldb中WriteBatch、Snapshot使用中讲过使用方法,这里面就不再继续讲用法了,这一节结合着之前写的Demo来讲源码。Snapshot源码之前写的demo为:private final File data...原创 2018-07-25 07:29:49 · 488 阅读 · 0 评论 -
levelDB WriteBatch源码解析
levelDB WriteBatch源码解析上一篇文章中讲了leveldb中WriteBatch、Snapshot使用,但是leveldb毕竟只是一个基础的存储引擎,没有太多的特性或者api使用可以讲,因此便直接从源码上开始,我这就从WriteBatch开始吧。有一些遗漏的以后补充进来,以后再慢慢进行整理。WriteBatch源码我们先看下WriteBatch,Writebat...原创 2018-07-23 08:04:20 · 725 阅读 · 0 评论 -
leveldb中WriteBatch、Snapshot使用
leveldb中WriteBatch、Snapshot使用上一节中仅仅做了一个leveldb的介绍,以及简单的put、get、del的使用,没有对leveldb的一些深入的特性进行讲解,算得上只是一个入门罢了,知道什么是leveldb,而作为一个基础的存储引擎,本身没有太多的特性其实也是正常的,如果想要在生产环境使用一个类似的存储,其实还是更推荐使用mapdb,有着相当丰富的特性供以使用,我有...原创 2018-04-08 07:56:28 · 2813 阅读 · 2 评论 -
leveldb入门
leveldb入门leveldb简介以前在大学的时候偶尔了解过leveldb,当时只是知道leveldb是一个存取性能极强的存储引擎,非常适合于顺序存储,当时时间不多,有很多其他的需要去学习,另外也没没有用到,因此一直没有了解过,最近有一些功夫突然再次看到了leveldb,想接触一下,然后发现这个是C++编写的,原生不支持java,但是有一个开发者照着C++的源码编写了一个java版,...原创 2018-04-03 08:02:10 · 2964 阅读 · 0 评论 -
netty编解码之jboss marshalling
netty编解码之jboss marshallingjboss marshalling是jboss内部的一个序列化框架,速度也十分快,这里netty也提供了支持,使用十分方便,不需要像protobuf一样编写proto文件,只需要提供两个编解码器即可,以下就是jboss marshalling使用的开始。源码程序model类model类和之前编写java序列化的时候没有区别,这里便不再多说,仅仅贴出原创 2017-12-11 08:10:28 · 3611 阅读 · 2 评论 -
netty编解码之使用protobuf
netty编解码之使用protobufprotobuf这个序列化框架在我们公司使用了,我负责的模块中使用protobuf生成了一些model,然后使用了protostuff对缓存在redis中的数据进行序列化和反序列化,速度非常快,解决了一些当时的序列化和反序列化太慢的问题,这节来讲下netty中使用protobuf进行序列化的用法。这里可以下载protobuf工具然后使用命令根据proto生成ja原创 2017-12-07 08:03:48 · 2050 阅读 · 3 评论 -
netty编解码之java原生序列化
netty序列化之java原生序列化前几天有空看了下netty使用java原生序列化、以及使用protobuf、jboss marshalling进行编解码,各种技术之间差异挺大,使用的方法各自不同,性能上原生的性能优势确实不大,但是另外两种确实很有优势,觉得有点意思,于是准备写一篇文章记载一下,但是一篇文章篇幅太长,因此拆成了三篇文章分别来讲。java序列化代码这个简单的程序就是server和cl原创 2017-12-06 07:46:06 · 1109 阅读 · 0 评论 -
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 · 12775 阅读 · 3 评论 -
JDK 动态代理运行原理
JDK 动态代理运行原理 程序演示 源码讲解 总结 这几天有空研究了下JDk的动态代理,JDK的动态代理类都在java.lang.reflect包下,写了一些小程序来演示了相关类的使用,同时做了一些与CGLIb的对比,以后有空再讲述下lombok中相关注解的使用。1. 程序演示接口:HelloWorld:public interface HelloWorld { voi原创 2017-11-09 07:58:01 · 882 阅读 · 0 评论 -
Spring cloud 中@EnableEurekaClient源码分析
Spring cloud 中@EnableEurekaClient源码分析上一篇文章中讲述了@EnableEurekaClient和@EnableDiscoveryClient区别,原想可能底层会有较多不同,但是查看源码的时候发现@EnableEurekaClient本身就是用@EnableDiscoveryClient来实现的,因此没有多大的研究价值,但是如果继续讲@EnableEurekaCli原创 2017-10-23 08:26:46 · 9291 阅读 · 5 评论 -
Spring boot 与 Docker-compose构建微服务应用
Spring boot 与 Docker-compose构建微服务应用前两天看了一篇博客,讲的是使用docker-compose将spring boot应用和mongodb应用一起构建,实现容器之间的相互通信,spring boot应用能够直接将数据存储到容器之中,但是那篇博客中在已有docker-compose.yml文件可以直接使用docker-compose进行build的时候,使用docke原创 2016-12-19 09:52:42 · 6992 阅读 · 0 评论 -
spring boot扫描自定义的servlet和filter
spring boot扫描自定义的servlet和filter这几天使用spring boot编写公司一个应用,在编写了一个filter,用于指定编码的filter,如下:/** * Created by xiaxuan on 16/11/1. */@WebFilter(urlPatterns = "/*",filterName="CharacterEncodeFilter",原创 2016-11-29 09:59:29 · 14617 阅读 · 3 评论 -
springboot整合jedisCluster
springboot整合jedisClustermaven依赖springboot整合jedisCluster相当简单,maven依赖如下: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> </depende原创 2016-11-25 07:26:35 · 7756 阅读 · 0 评论 -
osgi + felix example3编写与使用服务的改进
osgi + felix example3编写与使用服务的改进上一篇博文中我们提及了如何对一个服务进行注册,但在example2和example2b中都没有对这个服务进行相应的使用,在本文中将对这个服务进行使用相应的使用,在felix的官网中,对该服务的使用方法是对目前已经注册的bundle进行扫描,然后使用服务,但是个人觉得Activator这种启动bundle最好只有一个,并且本文搭建了一个完整原创 2016-07-01 07:57:13 · 9144 阅读 · 0 评论 -
osgi + felix example2b编写
前一篇博文中我们讲解了OSGI的传统注册式服务与声明式服务,再前一篇我们我们进行了osgi + felix example2的编写,这一篇博文我们编写了一个Bundle和一个接口并对这个接口进行了相应的实现之后,在这个bundle的start方法中进行了该服务的注册,并没有使用这个服务。本文中编写的程序仍然是不使用这个服务,只进行相应的注册,在example3中将会讲解使用这个服务。程序程序中变动的原创 2016-06-29 07:53:55 · 3172 阅读 · 0 评论 -
OSGI传统注册式服务与声明式服务
上一篇博文中我们编写了第二个简单的osgi的example,并编写了一个接口DictionaryService,并在Activator这个Bundle中实现了这个interface,并在start启动方法中进行了osgi服务的注册,但并没有使用这个服务,这一篇文章中并不讲解怎么使用这个已经注册的服务,但是会讲解服务的使用方式,一种为声明式服务,一种为传统注册式服务,以下就是开始讲解何为osgi的注册原创 2016-06-27 07:51:09 · 5267 阅读 · 0 评论 -
osgi + felix example2编写
在上次博文中配置了karaf的日志格式输出,在两篇之前的一篇文章编写了基本的felix中的简单的example编写,编写了一个简单的Activator,启动并得到正常的输出,这一篇博文将开始稍微复杂一点的程序编写,将进行一个服务的注册。 DictionaryService首先创建一个interface,命名为DictionaryService,添加以下内容:package cn.com.exampl原创 2016-06-25 08:04:16 · 2683 阅读 · 0 评论 -
osgi + camel + karaf配置日志输出
上篇博文中编了felix的一个简单example,然后演示了example的启动,Activator启动之后进行了控制台输出,但整个example feature的启动过程中那些bundle进行了install过程并没有演示,接下来将演示这一过程。配置日志首先对karaf的输出进行日志输出,先前在parent module中pom.xml中配置插件指定配置文件位置,如下所示: <plugin>原创 2016-06-24 08:02:00 · 5348 阅读 · 11 评论 -
osgi + felix example1编写
在上篇博文中,我们搭建了osgi的整个运行环境,并将其他个别组件也整合了进来用于后续的开发,本播客系列将会将apache felix官网中example全部编写一遍,然后进行osgi后续的文章编写,如osgi command,blueprint,configAdmin等等,这些暂且放置一边,日后写博文的时候再谈。example模块在上回建立的maven工程中,新建文件夹命名为Application,原创 2016-06-22 08:08:21 · 2691 阅读 · 0 评论 -
osgi+camel+karaf运行环境搭建(2)
本文开始osgi运行环境后续搭建,上文介绍了几个运行组件与容器,本文将开始具体的代码编写。root module打开intellij新建maven工程,待maven工程全部生成完成之后,在pom.xml中添加以下内容。<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <pro原创 2016-06-21 08:58:56 · 4047 阅读 · 2 评论 -
osgi+camel+karaf运行环境搭建(1)
这几天一直在学习与加深osgi中的一些东西,又去看了下apache felix中的几个example,于是决定将felix中的一些example写出来,但是不在使用felix官网中那样运行,而是从新搭建一个osgi的运行环境进行相应的学习,在这使用了karaf作为osgi的运行容器,同时整合camel进来,因为在后续会有更多的osgi中的运用,因此,本次全部整合进来。本文在此先对几个框架和容器进行相原创 2016-06-19 10:03:03 · 4166 阅读 · 0 评论 -
java实现一个简单的Web服务器
Web服务器也称为超文本传输协议服务器,使用http与其客户端进行通信,基于java的web服务器会使用两个重要的类,java.net.Socket类和java.net.ServerSocket类,并基于发送http消息进行通信。这个简单的Web服务器会有以下三个类:*HttpServer*Request*Response应用程序的入口在HttpServer类中,main(原创 2015-04-01 07:31:34 · 23387 阅读 · 8 评论 -
java连接MongoDB数据库
这段时间尝试了一下MongoDB,感觉十分易用,方便,相比关系型的数据库来说优势也很大,于是尝试了下使用java连接MongoDB,并进行了基本的增删改查操作。首先先在控制台中连接数据库,查看数据库有几个表。现在,新建一个maven工程,pom.xml中的依赖如下: org.apache.wicket wicket ${wicket.version}原创 2015-07-26 08:58:56 · 5116 阅读 · 9 评论