zyc的博客

疾风亦有归途

概述

LinkedBlockingQueue是一个基于单向链表并且可设置容量的阻塞队列。LinkedBlockingQueue中的元素都是按照FIFO即先进先出的元素排列的,在队列头部的元素是在队列中停留时间最长的元素,相反在队列尾部的元素是则是在队列中停留时间最短的元素。元素是从队列尾部新增进入队列的,而获取元素是从队列头部开始获取的。

阅读全文 »

概述

AbstractQueue提供一些Queue操作的基本实现。其中方法add,remove和element分别基于offer,poll和peek实现(需要子类自己实现),默认是抛出异常而不是通过false或null返回指示失败。

阅读全文 »

概述

BlockingQueue是Queue的一种,它的设计目的在于往队列中新增或者获取元素时提供阻塞的需求,例如常见的生产者-消费者模式。生产者往队列中添加元素时如果队列已经满了,那么就会阻塞当前线程直到队列空间变成可用为止。消费者从队列中获取元素时如果队列为空那么就会阻塞当前线程直到队列不为空为止。BlockingQueue中的方法对于特定的操作会有以下四种情况:抛出异常、返回特殊值(null或false,具体取决于操作),无限期地阻塞当前线程直到操作成功为止、在给定的最大时间限制内放弃操作。

阅读全文 »

概述

Queue是一种数据结构,它的设计目的在于处理任务之前先将任务有序的放到这种数据结构中(Queue),所以队列通常情况下是以FIFO(先进先出)的方式对元素进行排序(但不一定也有特殊的队列,例如优先级队列是通过comparator对元素进行排序的,或者是LIFO队列,即后进先出的队列)。Queue继承了Collection接口,所以队列也是java集合框架的一部分。同时Queue提供了不同于Collection接口中的新增,删除,获取这些语义的方法,这些方法中的每一种都以两种形式存在:一种在操作失败时引发异常,另一种返回特殊值(取决于操作,返回null或false)。

阅读全文 »

概述

FutureTask意为将来的任务,它是juc包下Future接口的一个简单实现类,FutureTask的主要作用是用来包装Callable或Runnable对象,由于FutureTask本身也实现了Runnable接口,因此它相当于扮演了委托人的角色,将自己提交给线程执行,然后线程执行FutureTask的run方法,FutureTask内部再调用被包装的Callable或Runnable对象,并且提供了名为get的阻塞方法(基于CAS+LockSupport实现)以便当前执行线程能够拿到被包装的Callable或Runnable对象执行返回的结果。

阅读全文 »

概述

AOP是Aspect Oriented Program的首字母缩写,翻译成中文为面向切面编程。java是面向对象(OOP)的编程语言,面向对象的特点是继承、封装和多态。而封装就要求将功能分散到不同的对象中去,这在软件设计中往往称为职责分配。实际上也就是说,让不同的类设计不同的方法。这样代码就分散到一个个的类中去了。这样做的好处是降低了代码的复杂程度,使类可重用。但是随着业务越来越复杂会发现程序中很多类都存在重复的代码,例如每个类中都会存在那种打印方法的入参、结果、耗时这种日志代码。这时比较聪明的工程师就会编写一个日志工具类然后在需要打印日志的方法中调用该工具类,或者是编写一个打印日志父类让需要打印日志的类继承该类,但是由于java只允许单继承,如果这个类需要扩展新功能就会变得很棘手。纵观上面两种方法无论是编写工具类还是继承父类就会将业务类与其耦合在一起,随着业务越来越复杂最终业务类就很有可能变得很难维护。那有没有一种方式能够动态的给类添加功能呢?答案是肯定的,这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。 我们可以将那些额外功能的代码编写成一个切面,等需要时再切入到对象之中。由此看来AOP其实是对OOP的一个补充,OOP将一个功能分割成多个对象,而AOP则提供切面为这些对象提供额外的功能。并且从技术角度来看aop基本上都是基于代理模式来实现的,也就是在运行时基于原始对象的特性选择jdk动态代理(生成目标对象实现接口的实现类)、cglib(基于asm库生成目标对象的子类)等方式来动态给对象添加功能。

阅读全文 »

概述

在阐述jdk动态代理背后的原理前我们有必要先了解一下代理的概念和分类。代理是指假如现在有一件事情需要我去做,但是我现在很忙没有空,此时我委托其他人代替我去做,例如我委托张三去帮我做。在这个过程中张三就起到了一个代理的作用,张三是代替我去做某件事情的。同时代理又分静态代理和动态代理两种。静态代理是指在做某件事情的过程前这个代理人就已经分配好了。而动态代理则是在做某件事情时代理人是动态分配的。动态代理相比于静态代理的优势在于做某件事情的时候是能够动态生成代理人,如果需要代理的对象很多,那么为每一个代理对象都提前分配一个代理人这是一件很麻烦也不好扩展的,此时动态代理相比于静态代理的优势就显现出来了。

阅读全文 »

概述

AnnotatedType表示当前程序中可能被注解的类型。 这些类型可能是Java编程语言中的任何Type,包括Class(原始类型)、ParameterizedType(参数化的类型、泛型类型)、TypeVariable(类型变量)、WildcardType(通配符类型)、GenericArrayType(泛型数组类型)这五种java中的具体类型。而AnnotatedType对这些类型作了一层包装,因为这些类型都是可能被注解的。同时AnnotatedType继承了AnnotatedElement使得我们能够在运行时基于反射api去分析获取那些十分复杂的数据结构中的注解。

阅读全文 »

概述

AnnotatedElement代表了JVM中当前正在运行的程序中带注解的元素 , 该接口允许以反射方式读取注释。该接口中所有方法返回的所有注释都是不可变的和可序列化的。调用方可以修改此接口的方法返回的数组,而不会影响返回给其他调用方的数组。 但是注解是可以以不同的形式存在于元素上的,例如直接存在于元素上,或者通过@Repeatable以另一个容器注解的形式存在于元素上,甚至是通过@Inherited以继承的方式存在于元素的父类上。总之要获取一个元素上的注解,不能单纯的以获取元素上的注解这种模糊的概念去获取,而应该以更为明确的获取以何种方式存在于元素上的注解获取相应的注解。

阅读全文 »

概述

jdk1.8之后添加了一个新的元注解@Repeatable,被该注解标记的注解表明是一个可以重复注解的注解。也就是说该注解可以重复的注解某个元素。

阅读全文 »