JAVA
文章平均质量分 85
爱艺欣聊编程
超级大码农
展开
-
Disruptor原理浅析
Disruptor是一个高吞吐量的异步处理框架,LMAX号称用它可以1秒钟处理600万订单,从一个简单的例子来分析Disruptor,下面的代码是基于2.10.4版本,不同的版本API有些变化,代码仅供参考。private static void testDisruptor() { RingBuffer ringBuffer = new RingBuffer( new EventFacto原创 2015-02-16 20:51:37 · 2535 阅读 · 0 评论 -
乱弹java并发(二)-- ConcurrentHashMap
ConcurrentHashMap是JUC中一个高性能的线程安全的hash表,key和value都不可为null,ConcurrentHashMap通过如下手段来来达到它的高性能:1、分离写锁:普通的Hash表通过桶数组+冲突链表来实现,ConcurrentHashMap增加了一个段结构(Segment),通过段数组+桶数组+冲突链表三层结构来实现,在进行put操作的时候先通过hash码定位到原创 2015-02-09 23:01:31 · 603 阅读 · 0 评论 -
乱弹java并发(三)-- CopyOnWriteArrayList和CopyOnWriteArraySet
CopyOnWriteArrayList是基于“写时复制”策略的线程安全的数组,它的特点是写加锁读不加锁,了解过ConcurrentHashMap的原理之后,再理解它的原理就比较简单了,来看看两个关键方法: public boolean add(E e) { final ReentrantLock lock = this.lock; lock.lock(); try {原创 2015-02-11 21:37:41 · 1492 阅读 · 0 评论 -
乱弹java并发(四)-- ThreadPoolExecutor
ThreadPoolExecutor是JDK5加入的一个线程池实现,我们知道线程池一般有两个作用:1、可以重复利用线程,省去反复创建线程的开销,这在高并发系统中不容小觑2、控制线程数量,避免过多的线程耗尽进程的栈空间。整个线程池由两个核心结构组成:线程集合、等待任务队列。ThreadPoolExecutor中有三个关键参数:corePoolSize、maximumPoolSize、ke原创 2015-02-11 22:07:57 · 623 阅读 · 0 评论 -
乱弹java并发(五)-- AQS
AQS(AbstractQueuedSynchronizer)是JDK中大部分同步工具:可重入锁(ReentrantLock)、可重入读写锁(ReentrantReadWriteLock)、计时闩(CountDownLatch)、信号量(Semaphore)、异步任务(FutureTask)实现的基础。它提供了五个模板方法: protected boolean tryAcquire(in原创 2015-02-12 22:09:05 · 674 阅读 · 0 评论 -
乱弹java并发(六)-- Condition
Condition可以让线程处于条件挂起的状态,它和锁(Lock)配合使用,Lock实例通过newCondition可以生成一个条件对象,Condition.await()让线程处于挂起等待状态,通过在别的线程中调用Condition.signal和Condition.signalAll唤醒处于等待的线程,它们的功能和Object的wait和notify、notifyAll方法功能是一样,wait原创 2015-02-13 22:14:21 · 551 阅读 · 0 评论 -
乱弹java并发(七)-- 轻量级锁、偏向锁
java6之前的同步时依赖操作系统互斥来实现的,互斥会导致频繁的线程上下文切换,消耗CPU资源,java6在HotSpot中引入了轻量级锁和偏向锁机制来对同步进行优化,它们的本意是在没有多线程竞争的前提下,减少传统的重量级锁使用操作系统互斥量产生的性能消耗。要了解轻量级锁,以及后面讲到的偏向锁原理和运作过程,必须从虚拟机(HotSpot)的对象头的内存布局开始介绍。HotSpot虚拟机的对象头原创 2015-02-14 00:29:42 · 1336 阅读 · 0 评论 -
乱弹java并发(八)-- Phaser
Phaser是java7新添加的一个同步工具,相比CyclicBarrier、CountDownLatch、Semaphore等同步工具,Phaser更灵活而且可复用(CyclicBarrier也可复用),Phaser包含几个动作:register:给Phaser增加parties,并且可以通过deRegister减少总parties(CyclicBarrier、CountDownLatch、原创 2015-02-14 15:39:51 · 846 阅读 · 0 评论 -
乱弹java并发(九)-- fork/join
ForkJoin是在java7引入的由Doug Lea设计的一个并行计算框架,ForkJoin框架包含两部分:1、把任务Fork成一系列的相互之间无依赖的递归子任务,不同的子任务可以由不同的CPU核心执行;2、合并(Join)子任务的执行结果。Doug Lea在ForkJoin中引入一个叫work steal的算法,即当某线程的任务队列已执行完时,可以扫描其它线程的任务队列,从其它线程的任务队列队原创 2015-02-15 00:58:25 · 679 阅读 · 0 评论 -
Netty为啥可靠(一)
NIO闲聊自从JAVA1.4推出NIO起,JAVA网络编程进入了一个全新的时代,传统网络IO(OIO)是傻等式的,一旦IO操作发起,那么用户线程就陷入很傻很天真的等待中,直到IO操作结束或者发生了断连,而NIO则要聪明许多是事件触发式的,只有当前有IO事件发生了,才会通知用户线程执行IO操作,当前操作结束之后不会阻塞等待可以执行其他的业务操作等待下一次事件,就好比上银行取钱,一种方式排队傻等直原创 2015-04-17 22:18:33 · 4045 阅读 · 0 评论 -
Netty为啥可靠(二)
Selector空轮询处理在NIO中通过Selector的轮询当前是否有IO事件,根据JDK NIO api描述,Selector的select方法会一直阻塞,直到IO事件达到或超时,但是在Linux平台上这里有时会出现问题,在某些场景下select方法会直接返回,即使没有超时并且也没有IO事件到达,这就是著名的epoll bug,这是一个比较严重的bug,它会导致线程陷入死循环,会让CPU飙原创 2015-04-18 22:14:17 · 5670 阅读 · 1 评论 -
Netty为啥可靠(三)
连接中断处理在客户端和服务端建立起连接之后,如果连接发生了意外中断,Netty也会及时释放连接句柄资源(因为TCP是全双工协议,通信双方都需要关闭和释放Socket句柄才不会发生句柄的泄漏,如不经过特殊处理是会发生句柄泄露的),原理如下:在读取数据时会调用io.netty.buffer.AbstractByteBuf.writeBytes(ScatteringByteChannel, in原创 2015-04-19 21:56:56 · 5104 阅读 · 0 评论 -
nginx健康检查导致的问题
最近有次web应用版本上线,出现了一个可怕的事情,上线之后所有http请求都报502,但是之前在测试环境和预发布环境测试功能是没有任何问题的。 502错误说明是tomcat应用出问题了,查看tomcat启动日志,没有任何异常,日志显示应用已经正常启动成功了,ssh连上服务器,通过wget调用接口发现是可以正常响应的,这就更说明了tomcat应用本身是没问题的。但是查看应用的localhost_a...原创 2018-03-02 16:23:30 · 5697 阅读 · 0 评论 -
一个传递依赖导致的应用崩溃
问题最近我们有个应用合并了一个任务的代码之后应用无法启动,报下面的错误:Caused by: java.lang.NoSuchMethodError: org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.modulesToInstall([Lcom/fasterxml/jackson/databind/Mo...原创 2018-09-28 16:21:55 · 1060 阅读 · 0 评论 -
乱弹java并发(一)-- BlockingQueue
最近抽空整理了一下几年前的学习笔记,发现有些东西久了不用就忘记了,感慨年纪大了忘性大呀。现在把这些笔记整理一下分享到博客上,分享的同时加深自己的记忆。java5加入了一个java.util.concurrent包,这个包的大部分代码作者都是Doug Lea大神,JUC对java并发编程有着里程碑式的意义。由于笔记是几年前的,当时的学习时在JDK6的基础上做的,所以如无特殊说明文中涉及到的代原创 2015-02-08 20:39:28 · 1053 阅读 · 0 评论 -
Netty内存池原理分析
为了避免频繁的内存分配给系统带来负担以及GC对系统性能带来波动,Netty4提出了全新的内存管理,使用了全新的内存池来管理内存的分配和回收。内存池这块的代码晦涩难懂,而且几乎没有注释,所以阅读起来比较费力,特别是以前没有接触过内存分配算法的阅读起来更为蛋疼,好在经过几个晚上的努力,终于捋出了一些端倪,特来此记录一番。Netty4的内存池集大家之精华,参考了各路英雄豪杰的优秀思想,它参考了sla原创 2015-04-29 22:13:08 · 24726 阅读 · 5 评论 -
基于Netty的Redis客户端-Nedis
最近温习了一遍Redis命令,忧伤的是很多东西已交还给老师,正好赶上antirez大神在愚人节发布了Redis 3.0,Redis终于有了支持集群的正式版本,于是心血来潮决定自己实现一个Redis客户端来抚慰我这颗忧伤的心灵。Jedis已经足够强大,它的网络连接是基于阻塞式IO,实现非常简单易懂,但是OIO和NIO相比性能上有劣势,于是决定通过NIO来实现和Redis服务器的网络连接,现在原创 2015-04-16 21:57:56 · 5509 阅读 · 3 评论 -
Spring bean的作用域
Spring IOC容器中,默认的bean作用域有两种:singleton,这种作用域的bean一旦创建后bean的生命周期和容器同步,只有容器关闭时才会销毁这种bean,相同id的bean在容器的生命周期内只会被实例化一次,通过相同的id向容器请求时会返回相同的实例prototype,这种作用域的bean不会交给容器托管,创建之后不会注册到容器,它的生老病死完全由应用层决定,每次通过原创 2015-03-01 22:17:37 · 1272 阅读 · 0 评论 -
Spring properties定义bean
Spring提供了丰富的标签和注解来进行bean的定义,除此之外框架来提供了扩展机制让使用可以通过properties来定义bean,与强大的标签式和注解式的bean定义相比,properties提供的规则要简单许多。key部分用.分隔即通过A.B来进行相关的属性定义,其中A表示bean名称,B通过不同的值还表达不同的含义:(class),bean的类型(parent),bean的原创 2015-03-15 17:27:04 · 2508 阅读 · 0 评论 -
spring属性占位符
在bean定义时设置bean属性的值时,除了设置固定的值,还可以通过EL表达式和占位符来设置,容器在解析bean定义时会对EL表达式和占位符进行解析求值。本篇来学习一下通过占位符定义属性的用法。占位符的取值范围有三个:系统变量(System.getProperty)、坏境变量(System.getEnv)、自定义的Properties文件。Spring提供了三种方式来配置加载自定义的pro原创 2015-03-15 21:54:38 · 7543 阅读 · 2 评论 -
Spring IOC容器bean初始化源码分析
上一篇分析对bean定义的解析源码进行了分析,这个过程的最终结果是把xml文件中bean的定义解析成一个个的BeanDefinition对象并且注册到容器中,在Spring IOC容器启动简介篇中分析,在容器启动的最后会对容器中的所有bean进行初始化,利用之前解析出的BeanDefinition对象,创建一个个最终的bean对象,并且完成bean之间的依赖注入,本篇从源码的角度分析在容器启动时所原创 2015-02-25 20:59:01 · 4424 阅读 · 2 评论 -
Spring PropertyEditor分析
通过xml解析器解析出bean定义之后,bean定义的所有属性都是字符串类型的,原创 2015-03-02 23:50:58 · 4989 阅读 · 0 评论 -
Spring conversion框架
框架简介在Spring PropertyEditor分析中介绍了如果通过PropertyEditor来进行值转换,已经如何根据自身的需求自定义PropertyEditor,但是Spring的这套处理框架存在几个问题:方法参数是弱类型,需要编写一些类型转化代码,对使用者不友好PropertyEditor是有状态的,如果共享实例在高并发条件下会有性能隐患,所以在对bean进行初始化是需原创 2015-03-04 21:18:47 · 3973 阅读 · 4 评论 -
在eclipse中玩起btrace
Btrace脚本可以让我们在不停止线上系统的情况来动态的添加一些脚本来对系统进行监控和调测,官方教程都是通过命令行来运行btrace脚本。现在我们来看怎么一步一步在eclipse中玩起Btrace,首先上官网https://kenai.com/projects/btrace/下载一个发布包,我 下的时Win平台的。要在eclipse中玩起btrace,首先在让btrace相关的jar包关联进来原创 2015-02-10 23:20:14 · 1820 阅读 · 0 评论 -
Spring bean定义解析源码分析
在上一篇Spring IOC容器启动简介中在ClassPathXmlApplicationContext的基础粗略的分析了IOC容器的启动过程,对一些比较复杂的步骤没有详细的说明,从本篇开始对其中的一些比较复杂的步骤进行分析。本篇对基于ClassPathXmlApplicationContext的IOC容器的bean定义的解析与加载过程进行分析。bean定义解析加载的简单时序图如下:b原创 2015-02-24 21:13:36 · 2987 阅读 · 0 评论 -
AOP框架简介
AOP:面向切面编程,是一种设计理念,并非Spring特有。AOP由于把原创 2015-03-05 23:15:13 · 1377 阅读 · 0 评论 -
Spring AspectJ LTW
LTW(Load Time Weaver),即加载期切面织入,是ApsectJ切面织入的一种方式,它通过JVM代理在类加载期替换字节码到达织入切面的目的。下面通过一个简单的例子来演示怎么使用LTW,然后从代码入手分析LTW的实现原理。简单的实例首先定义个切面类,该切面功能非常简单,就是在spring.beans.ltw及其所有子包下所有的类的方法调用前后各添加一行begin和end日志,使原创 2015-03-06 23:28:33 · 4819 阅读 · 1 评论 -
Spring IOC容器启动简介
BeanFactory和ApplicationContext都可以用来作为Bean工厂负责创建和管理Bean,相比之下ApplicationContext是BeanFactory的一个增强升级版,比如Application提供了强大的事件机制,自动加载BeanPostProcessor和BeanFactoryPostProcessor,预创建Bean等,一般情况下都使用ApplicationCon原创 2015-02-18 14:34:56 · 2849 阅读 · 0 评论 -
Spring AOP实现原理
在Spring AOP框架中学习了动态AOP的几种实现方式,本篇重点来学习一下动态AOP的实现原理。Spring AOP是利用代理模式,在运行时生成一个目标对象的代理,并且使用代理代替目标对象,整个过程对使用者透明,使用者无法像使用目标对象一样使用代理对象,代理对象类型是目标对象所属类的子类或者接口实现,这个子类也是在运行时动态生成,这个生成子类的过程使用操作字节码技术,Spring框架中使用原创 2015-03-11 23:22:52 · 6205 阅读 · 0 评论 -
Spring AOP框架使用
在Spring AspectJ LTW中分析如果在类加载期织入切面,本篇中学习如何在运行时动态的注入切面,这种方式在实际项目中使用比较多,在Spring AOP框架中提供了三种方式在程序运行时注入切面:ProxyBeanFactoryaop名称空间的标签Aspect注解下面通过几个简单的例子演示如何通过这几种方式来织入切面。ProxyBeanFactory这个例子非常简原创 2015-03-08 20:36:45 · 1368 阅读 · 0 评论 -
单元测试引入hsqldb探索
为了提高代码和产品质量,我们网站的大部分产品都接入了单测平台,任何任务在提测前都要执行整个提测工程的单元测试,测试结果全部通过并且覆盖率统计等指标达标之后才能通过提测申请。这当然对于提高产品代码质量是有非常大的好处的,有助于识别代码中的bug。但是在执行的过程中可不是那么顺利的,主要体现在有时单测执行失败并不是代码有什么bug,而是单测依赖的数据发生了变化导致单测的执行结果和预期的结果不一样ass...原创 2018-11-07 17:21:00 · 1106 阅读 · 0 评论